[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\n\nA clear and concise description of what the bug is.\n\n**To Reproduce**\n\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\n\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\n\nIf applicable, add screenshots to help explain your problem.\n\n**Kitex version:**\n\nPlease provide the version of Kitex you are using.\n\n**Environment:**\n\nThe output of `go env`.\n\n**Additional context**\n\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\n\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\n\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\n\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\n\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "#### What type of PR is this?\n<!--\nAdd one of the following kinds:\n\nbuild: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)\nci: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)\ndocs: Documentation only changes\nfeat: A new feature\noptimize: A new optimization\nfix: A bug fix\nperf: A code change that improves performance\nrefactor: A code change that neither fixes a bug nor adds a feature\nstyle: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)\ntest: Adding missing tests or correcting existing tests\nchore: Changes to the build process or auxiliary tools and libraries such as documentation generation\n-->\n\n#### What this PR does / why we need it (en: English/zh: Chinese):\n<!--\nThe description will be attached in Release Notes, \nso please describe it from user-oriented.\n-->\nen: \nzh:\n\n#### Which issue(s) this PR fixes:\n<!--\n*Automatically closes linked issue when PR is merged.\nEg: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.\n-->\n"
  },
  {
    "path": ".github/workflows/pr-check.yml",
    "content": "name: Pull Request Check\n\non: [pull_request]\n\npermissions:\n  contents: read\n  pull-requests: read\n\nenv:\n  GO_VERSION: 1.23\n  GOLANGCI_LINT_VERSION: latest\n\njobs:\n  compliant:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Check License Header\n        uses: apache/skywalking-eyes/header@v0.4.0\n\n      - name: typos-action\n        uses: crate-ci/typos@master\n\n  resolve-modules:\n    name: resolve module\n    runs-on: ubuntu-latest\n    outputs:\n      matrix: ${{ steps.set-matrix.outputs.matrix }}\n    steps:\n      - name: Checkout Repo\n        uses: actions/checkout@v4\n\n      - id: set-matrix\n        run: ./hack/resolve-modules.sh\n\n  lint:\n    name: lint module\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    needs: resolve-modules\n    strategy:\n      matrix: ${{ fromJson(needs.resolve-modules.outputs.matrix) }}\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-go@v5\n        with:\n          go-version: ${{ env.GO_VERSION }}\n      - name: Lint\n        uses: golangci/golangci-lint-action@v8\n        with:\n          version: ${{ env.GOLANGCI_LINT_VERSION }}\n          working-directory: ${{ matrix.workdir }}\n          args: --config=${{ github.workspace }}/.golangci.yml\n          only-new-issues: true\n"
  },
  {
    "path": ".github/workflows/tests.yml",
    "content": "name: Tests\n\non: [push, pull_request]\n\njobs:\n  ut:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Set up Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: 1.23\n\n      - uses: actions/cache@v3\n        with:\n          path: ~/go/pkg/mod\n          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}\n          restore-keys: |\n            ${{ runner.os }}-go-\n\n      - name: Unit Test\n        run: make test\n"
  },
  {
    "path": ".gitignore",
    "content": "# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Dependency directories (remove the comment below to include it)\n# vendor/\n\n# IDE config\n.vscode\n.idea\n\n*/vendor\n*/bin\n*/log"
  },
  {
    "path": ".golangci.yml",
    "content": "version: \"2\"\nrun:\n  timeout: \"30m\"\nlinters:\n  exclusions:\n    generated: lax\n    presets:\n      - comments\n      - common-false-positives\n      - legacy\n      - std-error-handling\n    paths:\n      - open-payment-platform/internal/payment/infrastructure/ent\n      - third_party$\n      - builtin$\n      - examples$\nformatters:\n  exclusions:\n    generated: lax\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\n  settings:\n    gofumpt:\n      extra-rules: true\n"
  },
  {
    "path": ".licenserc.yaml",
    "content": "header:\n  license:\n    spdx-id: Apache-2.0\n    copyright-owner: CloudWeGo Authors\n\n  paths:\n    - \"**/*.go\"\n    - \"**/*.s\"\n\n  paths-ignore:\n    - bookinfo/kitex_gen/**\n    - bookinfo/internal/server/**/wire_gen.go\n    - open-payment-platform/kitex_gen/**\n    - open-payment-platform/cmd/**/wire_gen.go\n    - open-payment-platform/internal/**/infrastructure/ent/**\n    - easy_note/kitex_gen/**\n    - easy_note/cmd/api/biz/model/**\n    - easy_note/cmd/api/biz/router/**\n    - easy_note/cmd/api/router_gen.go\n    - book-shop/kitex_gen/**\n    - book-shop/docs/**\n    - gomall/app/frontend/hertz_gen/**\n    - gomall/rpc_gen/**\n    - gomall/tutorial/**\n\n  comment: on-failure\n\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nconduct@cloudwego.io.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to Contribute\n\n## Your First Pull Request\nWe use github for our codebase. You can start by reading [How To Pull Request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests).\n\n## Branch Organization\nWe use [git-flow](https://nvie.com/posts/a-successful-git-branching-model/) as our branch organization, as known as [FDD](https://en.wikipedia.org/wiki/Feature-driven_development)\n\n## Bugs\n### 1. How to Find Known Issues\nWe are using [Github Issues](https://github.com/cloudwego/kitex/issues) for our public bugs. We keep a close eye on this and try to make it clear when we have an internal fix in progress. Before filing a new task, try to make sure your problem doesn’t already exist.\n\n### 2. Reporting New Issues\nProviding a reduced test code is a recommended way for reporting issues. Then can placed in:\n- Just in issues\n- [Golang Playground](https://play.golang.org/)\n\n### 3. Security Bugs\nPlease do not report the safe disclosure of bugs to public issues. Contact us by [Support Email](mailto:conduct@cloudwego.io)\n\n## How to Get in Touch\n- [Email](mailto:conduct@cloudwego.io)\n\n## Submit a Pull Request\nBefore you submit your Pull Request (PR) consider the following guidelines:\n1. Search [GitHub](https://github.com/cloudwego/kitex/pulls) for an open or closed PR that relates to your submission. You don't want to duplicate existing efforts.\n2. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add. Discussing the design upfront helps to ensure that we're ready to accept your work.\n3. [Fork](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) the cloudwego/kitex repo.\n4. In your forked repository, make your changes in a new git branch:\n    ```\n    git checkout -b my-fix-branch develop\n    ```\n5. Create your patch, including appropriate test cases.\n6. Follow our [Style Guides](#code-style-guides).\n7. Commit your changes using a descriptive commit message that follows [AngularJS Git Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit).\n   Adherence to these conventions is necessary because release notes are automatically generated from these messages.\n8. Push your branch to GitHub:\n    ```\n    git push origin my-fix-branch\n    ```\n9. In GitHub, send a pull request to `kitex:develop`\n\n## Contribution Prerequisites\n- Our development environment keeps up with [Go Official](https://golang.org/project/).\n- You need fully checking with lint tools before submit your pull request. [gofmt](https://golang.org/pkg/cmd/gofmt/) and [golangci-lint](https://github.com/golangci/golangci-lint)\n- You are familiar with [Github](https://github.com)\n- Maybe you need familiar with [Actions](https://github.com/features/actions)(our default workflow tool).\n\n## Code Style Guides\nAlso see [Pingcap General advice](https://pingcap.github.io/style-guide/general.html).\n\nGood resources:\n- [Effective Go](https://golang.org/doc/effective_go)\n- [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments)\n- [Uber Go Style Guide](https://github.com/uber-go/guide/blob/master/style.md)\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "Makefile",
    "content": "TOOLS_SHELL=\"./hack/tools.sh\"\n\n.PHONY: test\ntest:\n\t@${TOOLS_SHELL} test\n\t@echo \"go test finished\"\n\n\n\n.PHONY: vet\nvet:\n\t@${TOOLS_SHELL} vet\n\t@echo \"vet check finished\""
  },
  {
    "path": "README.md",
    "content": "# CloudWeGo Demo for Business\n\nThis repo contains CloudWeGo demos with business logic, providing valuable references for enterprise user using in production.\n\nEach demo should/may contain multiple CloudWeGo subprojects, e.g. Kitex & Hertz, and demonstrate an individual business scenario.\n\n## Demo List\n\n### 1. Bookinfo\n\n#### Description\n##### What is it about and what problem does it solve?\n- How to use kitex proxyless in istio?\n- How to implement full-process traffic lane using CloudWeGo?\n\n##### What is the business scenario?\nRewrite **[Bookinfo](https://istio.io/latest/docs/examples/bookinfo/)** project using `hertz`, `kitex`, same as the **[Bookinfo](https://istio.io/latest/docs/examples/bookinfo/)**\n\n> The application displays information about a book, similar to a single catalog entry of an online book store. Displayed on the page is a description of the book, book details (ISBN, number of pages, and so on), and a few book reviews.\n\nThe Bookinfo application is broken into four separate microservices:\n\n- **productpage**. The productpage microservice calls the details and reviews **microservices** to populate the page.\n- **details**. The details microservice contains book information.\n- **reviews**. The reviews microservice contains book reviews. It also calls the ratings microservice.\n- **ratings**. The ratings microservice contains book ranking information that accompanies a book review.\n\n##### What are the core technologies/projects used?\n\n- [x] Use `istiod` as xDS server for CRD configuration and distribution\n- [x] Use `wire` for dependency injection\n- [x] Use `opentelemetry` for tracing\n- [x] Implement proxyless `flow lane` with [`Kitex-xds`](https://github.com/kitex-contrib/xds) and `opentelemetry baggage`\n- [x] Implement a bookinfo ui using `arco-design` react\n\n##### Which CloudWeGo subprojects are used? List all technologies used.\n- [Kitex](https://github.com/cloudwego/kitex)\n- [Hertz](https://github.com/cloudwego/hertz)\n- [kitex-xds](https://github.com/kitex-contrib/xds)\n- [kitex-opentelemetry](https://github.com/kitex-contrib/obs-opentelemetry)\n- [hertz-opentelemetry](https://github.com/hertz-contrib/obs-opentelemetry)\n\n##### Detailed documentation\n[bookinfo](./bookinfo/README.md)\n\n#### Contributors & Maintainers\n[@CoderPoet](https://github.com/CoderPoet)\n\n\n### 2. Open Payment Platform\n\n#### Description\n##### What is it about and what problem does it solve?\n- How to use kitex generic call as the http gateway?\n- How to implement Clean Structure of `Go` using kitex?\n\n##### What is the business scenario?\n> The application demonstrates the usage of kitex generic call.\n\n- We build the `generic call` client for each backend server by traversing IDL in Hertz.\n- Hertz will accept the requests with the query path of prefix `/gateway` .\n- `Gateway` handler will process these requests and route them to backend server by `generic call` client.\n- `payment` server is just a sample server using kitex.This service design pkg with `Clean Structure`.\n\n##### What are the core technologies/projects used?\n\n- [x] Use `Hertz` as Gateway.\n- [x] Use `Kitex` generic call client route requests.\n- [x] Use `Kitex` as RPC framework to build micro-services.\n- [x] Use `Clean Architecture` for design pkg and code layout.\n- [x] Use `ent` entity framework for implementing repository.\n- [x] Use `wire` for dependency injection\n- [x] Use `Nacos` as service registry.\n- [x] Use `MySQL` as RDBMS.\n\n##### Which CloudWeGo subprojects are used? List all technologies used.\n- [Kitex](https://github.com/cloudwego/kitex)\n- [Hertz](https://github.com/cloudwego/hertz)\n- kitex-layout(coming soon)\n\n##### Detailed documentation\n[Open Payment Platform](./open-payment-platform/README.md)\n\n#### Contributors & Maintainers\n[@baiyutang](https://github.com/baiyutang)\n\n\n### 3. Easy Note\n\n#### Description\n##### What is it about and what problem does it solve?\n- How to get started with Hertz and Kitex collaboration?\n- How to structure projects when using Hertz and Kitex?\n\n##### What is the business scenario?\nMigrate **[easy_note](https://github.com/cloudwego/kitex-examples/tree/main/bizdemo/easy_note)** and optimize the project.\n\n> The application shows a note service that allows users to create, delete, update, and query notes.\n\nThe easy_note application is divided into three microservices:\n\n- **demoapi** is an HTTP service that handles HTTP requests and calls other services via RPC.\n- **demouser** is an RPC service that handles user related operations.\n- **demonote** is an RPC service that handles note related operations and calls demouser service via RPC.\n\n##### What are the core technologies/projects used?\n\n- [x] Use `hz` and `kitex` to generate code\n- [x] Use Hertz `requestid`, `jwt`, `pprof`, `gzip` middlewares\n- [x] Use `go-tagexpr` and `thrift-gen-validator` for validating HTTP and RPC request\n- [x] Use `obs-opentelemetry` for tracing\n- [x] Use `etcd` as service registry.\n- [x] Use `GORM` for implementing repository.\n- [x] Use `MySQL` as RDBMS.\n\n##### Which CloudWeGo subprojects are used? List all technologies used.\n- [Hertz](https://github.com/cloudwego/hertz)\n  - [obs-opentelemetry](https://github.com/hertz-contrib/obs-opentelemetry)\n  - [requestid](https://github.com/hertz-contrib/requestid)\n  - [jwt](https://github.com/hertz-contrib/jwt)\n  - [pprof](https://github.com/hertz-contrib/pprof)\n  - [gzip](https://github.com/hertz-contrib/gzip)\n- [Kitex](https://github.com/cloudwego/kitex)\n  - [obs-opentelemetry](https://github.com/kitex-contrib/obs-opentelemetry)\n  - [registry-etcd](https://github.com/kitex-contrib/registry-etcd)\n- [thrift-gen-validator](https://github.com/cloudwego/thrift-gen-validator)\n\n##### Detailed documentation\n[easy_note](./easy_note/README.md)\n\n#### Contributors & Maintainers\n- [@justlorain](https://github.com/justlorain)\n- [@li-jin-gou](https://github.com/li-jin-gou)\n\n### 4. Book Shop\n\n#### Description\n##### What is it about and what problem does it solve?\n- How to integrate middlewares(such as `ElasticSearch`, `Redis`...) in Kitex project?\n- How to layer code in projects of different complexity using Hertz and Kitex?\n\n##### What is the business scenario?\n> The application shows an e-commerce system that includes merchants managing items, consumers managing personal accounts and placing orders to buy items.\n\nThe book-shop application is divided into four microservices:\n\n- **facade** is an HTTP service that handles HTTP requests and calls other services via RPC.\n- **user** is an RPC service that handles user managements.\n- **item** is an RPC service that handles item managements.\n- **order** is an RPC service that handles order managements.\n\n##### What are the core technologies/projects used?\n\n- [x] Use `Hertz` as Gateway.\n- [x] Use `Kitex` as RPC framework to build microservices.\n- [x] Use Hertz `swagger`, `jwt`, `pprof`, `gzip` middlewares.\n- [x] Use `ETCD` as service registry.\n- [x] Use `MySQL` as RDBMS.\n- [x] Use `Redis` as cache.\n- [x] Use `ElasticSearch` as search-engine.\n\n##### Which CloudWeGo subprojects are used? List all technologies used.\n\n- [Hertz](https://github.com/cloudwego/hertz)\n  - [swagger](http://github.com/hertz-contrib/swagger)\n  - [jwt](http://github.com/hertz-contrib/jwt)\n  - [pprof](https://github.com/hertz-contrib/pprof)\n  - [gzip](https://github.com/hertz-contrib/gzip)\n- [Kitex](https://github.com/cloudwego/kitex)\n  - [registry-etcd](https://github.com/kitex-contrib/registry-etcd)\n- [sonic](https://github.com/bytedance/sonic)\n\n##### Detailed documentation\n[Book Shop](./book-shop/README.md)\n\n#### Contributors & Maintainers\n[@bodhisatan](https://github.com/bodhisatan)\n\n### 5. [FreeCar](https://github.com/CyanAsterisk/FreeCar)\n\n#### Description\n##### What is it about and what problem does it solve?\n- How to use the idea of domain-driven development to develop in Kitex?\n- How to develop Hertz and Kitex through RPC + AGW mode?\n\n##### What is the business scenario?\n>Time-sharing car rental system kit in the cloud-native era.\n\nThe FreeCar application is divided into six microservices:\n\n- **api** is an HTTP service that handles HTTP requests and calls other services via RPC.\n- **user** is an RPC service that handles user related operations.\n- **profile** is an RPC service that handles profile related operations.\n- **blob** is an RPC service that handles blob related operations.\n- **car** is an RPC service that handles car related operations.\n- **trip** is an RPC service that handles trip related operations.\n\n##### What are the core technologies/projects used?\n\n- [x] Use `hz` and `kitex` to generate code\n- [x] Use Hertz `paseto`, `cors`, `gzip`, `http2`, `limiter`, `opensergo`, `pprof`, `websocket` middlewares\n- [x] Use `obs-opentelemetry` for tracing\n- [x] Use `consul` as service registry and config center.\n- [x] Use `GORM` for implementing repository.\n- [x] Use `MySQL` as RDBMS.\n- [x] Use `MongoDB` as DOCDB.\n- [x] Use `Redis` as cache.\n- [x] Use `MinIO` as object storage center.\n- [x] Use `RabbitMQ` as MQ.\n- [x] Implement a [FreeCar-Admin](https://github.com/CyanAsterisk/FreeCar-Admin) using `arco-design` react.\n- [x] Implement a [FreeCar-MP](https://github.com/CyanAsterisk/FreeCar-MP) using WeChat applet.\n\n##### Which CloudWeGo subprojects are used? List all technologies used.\n- [Hertz](https://github.com/cloudwego/hertz)\n  - [obs-opentelemetry](https://github.com/hertz-contrib/obs-opentelemetry)\n  - [registry](https://github.com/hertz-contrib/registry)\n  - [paseto](https://github.com/hertz-contrib/paseto)\n  - [cors](https://github.com/hertz-contrib/cors)\n  - [pprof](https://github.com/hertz-contrib/pprof)\n  - [gzip](https://github.com/hertz-contrib/gzip)\n  - [http2](https://github.com/hertz-contrib/http2)\n  - [limiter](https://github.com/hertz-contrib/limiter)\n  - [opensergo](https://github.com/hertz-contrib/opensergo)\n  - [websocket](https://github.com/hertz-contrib/websocket)\n- [Kitex](https://github.com/cloudwego/kitex)\n  - [obs-opentelemetry](https://github.com/kitex-contrib/obs-opentelemetry)\n  - [registry-consul](https://github.com/kitex-contrib/registry-consul)\n\n##### Detailed documentation\n[FreeCar](https://github.com/CyanAsterisk/FreeCar/blob/dev/README.md)\n\n#### Contributors & Maintainers\n- [@L2ncE](https://github.com/L2ncE)\n- [@Claude-Zq](https://github.com/Claude-Zq)"
  },
  {
    "path": "_typos.toml",
    "content": "# Typo check: https://github.com/crate-ci/typos\n\n[files]\nextend-exclude = [\n    \"go.mod\",\n    \"go.sum\",\n    \"go.work.sum\",\n    \"check_branch_name.sh\",\n    \"*/licenses/*\",\n    \"bootstrap.*.js\",\n    \"hack/*\",\n    \"open-payment-platform/internal/payment/infrastructure/ent/*\",\n]\n\n[default.extend-identifiers]\n"
  },
  {
    "path": "book-shop/Makefile",
    "content": "# Copyright 2022 CloudWeGo Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\nMODULE = github.com/cloudwego/biz-demo/book-shop\n\n# start the environment of demo\n.PHONY: start\nstart:\n\tdocker-compose up -d\n\n# stop the environment of demo\n.PHONY: stop\nstop:\n\tdocker-compose down\n\n# run the facade service\n.PHONY: facade\nfacade:\n\tsh app/facade/run.sh\n\n# run the user service\n.PHONY: user\nuser:\n\tgo run app/user/*.go\n\n# run the item service\n.PHONY: item\nitem:\n\tgo run app/item/*.go\n\n# run the order service\n.PHONY: order\norder:\n\tgo run app/order/*.go\n"
  },
  {
    "path": "book-shop/README.md",
    "content": "# Book Shop\n\n## Introduction\nAn e-commerce demo built with `Kitex` and `Hertz`.\n\n| Service Name       | Usage          | Framework    | protocol | Path       | IDL              |\n|--------------------|----------------|--------------|----------|------------|------------------|\n| facade             | HTTP interface | kitex/hertz  | http     | app/facade |                  |\n| cwg.bookshop.user  | user service   | kitex/gorm   | thrift   | app/user   | idl/user.thrift  |\n| cwg.bookshop.order | order service  | kitex/gorm   | thrift   | app/order  | idl/order.thrift |\n| cwg.bookshop.item  | item service   | kitex/gorm   | thrift   | app/item   | idl/item.thrift  |\n\n* components used\n  * ElasticSearch\n  * Kibana\n  * MySQL\n  * Redis\n  * ETCD\n* Hertz middlewares used\n  * [swagger](http://github.com/hertz-contrib/swagger)\n  * [JWT](http://github.com/hertz-contrib/jwt)\n  * [pprof](https://github.com/hertz-contrib/pprof)\n  * [gzip](https://github.com/hertz-contrib/gzip)\n\n## Architecture\n### Technology Architecture\n![](./pics/arch.png)\n### Service Calling Relations\n![](./pics/relation.png)\n## Quick Start\n\n### Setup Environment\n```shell\n$ make start\n```\n\n### Run Services\n```shell\n$ make user\n$ make item\n$ make order\n$ make facade\n```\n\n### Stop Environment\n```shell\n$ make stop\n```\n\n### Get Documents & Run Test\nbrowse to [http://localhost:8080/swagger/index.html](http://localhost:8080/swagger/index.html)\n\n## Examples\n### pprof\n```shell\n$ go tool pprof -http=:1234 http://localhost:8080/debug/pprof/heap\n```\n![](./pics/pprof.png)\n### User Service\n#### User Register\n![](./pics/register.png)\n#### User Login\n![](./pics/login.png)\n#### Shop Login\n![](./pics/shop_login.png)\n#### JWT Auth\n![](./pics/auth.png)\n### Item Service\n#### Add Item\n![](./pics/item_add.png)\n#### Edit Item\n![](./pics/item_edit.png)\n#### Delete Item\n![](./pics/item_del.png)\n#### Offline Item\n![](./pics/item_offline.png)\n#### Online Item\n![](./pics/item_online.png)\n#### Get Item\n![](./pics/item_get.png)\n#### List Items\n![](./pics/item_list.png)\n#### Batch Get Items (2C Interface)\n![](./pics/item_2c_get.png)\n#### Search Items (2C Interface)\n![](./pics/item_search.png)\n### Order Service\n#### Create Order\n![](./pics/order_create.png)\n#### Cancel Order\n![](./pics/order_cancel.png)\n#### List Orders\n![](./pics/order_list.png)\n#### Get Order\n![](./pics/order_get.png)\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_item/add.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_item\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// AddProduct godoc\n// @Summary add product\n// @Description add product\n// @Tags product module\n// @Accept json\n// @Produce json\n// @Param addProductRequest body model.AddProductRequest true \"request param of adding product\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /item2b/add [post]\nfunc AddProduct(ctx context.Context, c *app.RequestContext) {\n\tvar addReq model.AddProductRequest\n\tif err := c.BindAndValidate(&addReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\treq := &item.AddReq{\n\t\tName:        addReq.Name,\n\t\tPic:         addReq.Pic,\n\t\tDescription: addReq.Description,\n\t\tProperty: &item.BookProperty{\n\t\t\tIsbn:     addReq.ISBN,\n\t\t\tSpuName:  addReq.SpuName,\n\t\t\tSpuPrice: addReq.SpuPrice,\n\t\t},\n\t\tPrice: addReq.Price,\n\t\tStock: addReq.Stock,\n\t}\n\tpid, err := client.AddProduct(ctx, req)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tmodel.SendResponse(c, errno.Success, map[string]interface{}{\n\t\t\"product_id\": strconv.FormatInt(pid, 10),\n\t})\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_item/del.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_item\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// DelProduct godoc\n// @Summary delete product\n// @Description delete product\n// @Tags product module\n// @Accept json\n// @Produce json\n// @Param delProductRequest body model.OperateProductReq true \"request param of operating product\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /item2b/del [post]\nfunc DelProduct(ctx context.Context, c *app.RequestContext) {\n\tvar delReq model.OperateProductReq\n\tif err := c.BindAndValidate(&delReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tpid, err := strconv.ParseInt(delReq.ProductId, 10, 64)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\terr = client.OperateProduct(ctx, pid, \"del\")\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tmodel.SendResponse(c, errno.Success, nil)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_item/edit.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_item\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// EditProduct godoc\n// @Summary edit product\n// @Description edit product\n// @Tags product module\n// @Accept json\n// @Produce json\n// @Param editProductRequest body model.EditProductRequest true \"request param of editing product\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /item2b/edit [post]\nfunc EditProduct(ctx context.Context, c *app.RequestContext) {\n\tvar editReq model.EditProductRequest\n\tif err := c.BindAndValidate(&editReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tpid, err := strconv.ParseInt(editReq.ProductId, 10, 64)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\treq := &item.EditReq{\n\t\tProductId:   pid,\n\t\tName:        editReq.Name,\n\t\tPic:         editReq.Pic,\n\t\tDescription: editReq.Description,\n\t\tPrice:       editReq.Price,\n\t\tStock:       editReq.Stock,\n\t}\n\tproperty := &item.BookProperty{}\n\tif editReq.SpuPrice != nil {\n\t\tproperty.SpuPrice = *editReq.SpuPrice\n\t}\n\tif editReq.SpuName != nil {\n\t\tproperty.SpuName = *editReq.SpuName\n\t}\n\tif editReq.ISBN != nil {\n\t\tproperty.Isbn = *editReq.ISBN\n\t}\n\tif editReq.SpuPrice != nil || editReq.SpuName != nil || editReq.ISBN != nil {\n\t\treq.Property = property\n\t}\n\terr = client.EditProduct(ctx, req)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tmodel.SendResponse(c, errno.Success, nil)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_item/get.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_item\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// GetProduct godoc\n// @Summary get product by product_id\n// @Description get product by product_id\n// @Tags product module\n// @Accept json\n// @Produce json\n// @Param product_id query int true \"product_id\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /item2b/get [get]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tproductIdStr := c.Query(\"product_id\")\n\tif productIdStr == \"\" {\n\t\tmodel.SendResponse(c, errno.ConvertErr(errors.New(\"未传入product_id\")), nil)\n\t\treturn\n\t}\n\n\tproductId, err := strconv.ParseInt(productIdStr, 10, 64)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tproduct, err := client.GetProduct(ctx, productId)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tmodel.SendResponse(c, errno.Success, product)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_item/list.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_item\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// ListProduct godoc\n// @Summary get product list\n// @Description get product list\n// @Tags product module\n// @Accept json\n// @Produce json\n// @Param listProductReq body model.ListProductReq true \"request param of listing products\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /item2b/list [post]\nfunc ListProduct(ctx context.Context, c *app.RequestContext) {\n\tvar listReq model.ListProductReq\n\tif err := c.BindAndValidate(&listReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\treq := &item.ListReq{\n\t\tName:    listReq.Name,\n\t\tSpuName: listReq.SpuName,\n\t\tStatus:  (*item.Status)(listReq.Status),\n\t}\n\n\tproducts, err := client.ListProduct(ctx, req)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tmodel.SendResponse(c, errno.Success, products)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_item/mget2c.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_item\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// MGetProduct2C godoc\n// @Summary batch get products by product_id (2C interface)\n// @Description batch get products by product_id (2C interface)\n// @Tags product module(2C)\n// @Accept json\n// @Produce json\n// @Param product_ids query string true \"product-ids separated by commas\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /item2c/mget [get]\nfunc MGetProduct2C(ctx context.Context, c *app.RequestContext) {\n\tproductIdsStr := c.Query(\"product_ids\")\n\tif productIdsStr == \"\" {\n\t\tmodel.SendResponse(c, errno.ConvertErr(errors.New(\"未传入product_id\")), nil)\n\t\treturn\n\t}\n\tproductIdStrArr := strings.Split(productIdsStr, \",\")\n\tproductIds := make([]int64, 0)\n\tfor _, v := range productIdStrArr {\n\t\tcur, err := strconv.ParseInt(v, 10, 64)\n\t\tif err != nil {\n\t\t\tmodel.SendResponse(c, errno.ConvertErr(errors.New(\"非法参数\")), nil)\n\t\t\treturn\n\t\t}\n\t\tproductIds = append(productIds, cur)\n\t}\n\n\tproducts, err := client.MGetProducts2C(ctx, productIds)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tmodel.SendResponse(c, errno.Success, products)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_item/offline.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_item\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// OfflineProduct godoc\n// @Summary offline product\n// @Description offline product\n// @Tags product module\n// @Accept json\n// @Produce json\n// @Param offlineProductRequest body model.OperateProductReq true \"request param of operating product\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /item2b/offline [post]\nfunc OfflineProduct(ctx context.Context, c *app.RequestContext) {\n\tvar offlineReq model.OperateProductReq\n\tif err := c.BindAndValidate(&offlineReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tpid, err := strconv.ParseInt(offlineReq.ProductId, 10, 64)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\terr = client.OperateProduct(ctx, pid, \"offline\")\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tmodel.SendResponse(c, errno.Success, nil)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_item/online.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_item\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// OnlineProduct godoc\n// @Summary online product\n// @Description online product\n// @Tags product module\n// @Accept json\n// @Produce json\n// @Param onlineProductRequest body model.OperateProductReq true \"request param of operating product\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /item2b/online [post]\nfunc OnlineProduct(ctx context.Context, c *app.RequestContext) {\n\tvar onlineReq model.OperateProductReq\n\tif err := c.BindAndValidate(&onlineReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tpid, err := strconv.ParseInt(onlineReq.ProductId, 10, 64)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\terr = client.OperateProduct(ctx, pid, \"online\")\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tmodel.SendResponse(c, errno.Success, nil)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_item/search.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_item\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SearchProduct godoc\n// @Summary search products (2C interface)\n// @Description search products (2C interface)\n// @Tags product module(2C)\n// @Accept json\n// @Produce json\n// @Param searchProductReq body model.SearchProductReq true \"request param of searching products\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /item2c/search [post]\nfunc SearchProduct(ctx context.Context, c *app.RequestContext) {\n\tvar searchReq model.SearchProductReq\n\tif err := c.BindAndValidate(&searchReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\treq := &item.SearchReq{\n\t\tName:        searchReq.Name,\n\t\tDescription: searchReq.Description,\n\t\tSpuName:     searchReq.SpuName,\n\t}\n\tproducts, err := client.SearchProduct(ctx, req)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tmodel.SendResponse(c, errno.Success, products)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_order/cancel.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_order\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// CancelOrder godoc\n// @Summary consumer cancels order\n// @Description consumer cancels order\n// @Tags order module\n// @Accept json\n// @Produce json\n// @Param cancelOrderReq body model.CancelOrderReq true \"request param to cancel one order\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /order/cancel [post]\nfunc CancelOrder(ctx context.Context, c *app.RequestContext) {\n\tvar cancelReq model.CancelOrderReq\n\tif err := c.BindAndValidate(&cancelReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\torderId, err := strconv.ParseInt(cancelReq.OrderId, 10, 64)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\terr = client.CancelOrder(ctx, orderId)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tmodel.SendResponse(c, errno.Success, nil)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_order/create.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_order\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/jwt\"\n)\n\n// CreateOrder godoc\n// @Summary consumer creates order\n// @Description consumer creates order\n// @Tags order module\n// @Accept json\n// @Produce json\n// @Param createOrderReq body model.CreateOrderReq true \"request param to create one order\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /order/create [post]\nfunc CreateOrder(ctx context.Context, c *app.RequestContext) {\n\tvar createReq model.CreateOrderReq\n\tif err := c.BindAndValidate(&createReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tclaims := jwt.ExtractClaims(ctx, c)\n\tuserID := int64(claims[conf.IdentityKey].(float64))\n\n\tpid, err := strconv.ParseInt(createReq.ProductId, 10, 64)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\treq := &order.CreateOrderReq{\n\t\tUserId:    userID,\n\t\tAddress:   createReq.Address,\n\t\tProductId: pid,\n\t\tStockNum:  createReq.StockNum,\n\t}\n\terr = client.CreateOrder(ctx, req)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tmodel.SendResponse(c, errno.Success, nil)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_order/get.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_order\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// GetOrder godoc\n// @Summary get order by order_id\n// @Description get order by order_id\n// @Tags order module\n// @Accept json\n// @Produce json\n// @Param order_id query int true \"order id\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /order/get [get]\nfunc GetOrder(ctx context.Context, c *app.RequestContext) {\n\torderIdStr := c.Query(\"order_id\")\n\tif orderIdStr == \"\" {\n\t\tmodel.SendResponse(c, errno.ConvertErr(errors.New(\"未传入order_id\")), nil)\n\t\treturn\n\t}\n\n\torderId, err := strconv.ParseInt(orderIdStr, 10, 64)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\torder, err := client.GetOrderById(ctx, orderId)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tmodel.SendResponse(c, errno.Success, order)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_order/list.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_order\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/jwt\"\n)\n\n// ListOrder godoc\n// @Summary get order list of a consumer\n// @Description get order list of a consumer\n// @Tags order module\n// @Accept json\n// @Produce json\n// @Param listOrderReq body model.ListOrderReq true \"request param to get order list\"\n// @Security TokenAuth\n// @Success 200 {object} model.Response\n// @Router /order/list [post]\nfunc ListOrder(ctx context.Context, c *app.RequestContext) {\n\tvar listReq model.ListOrderReq\n\tif err := c.BindAndValidate(&listReq); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tclaims := jwt.ExtractClaims(ctx, c)\n\tuserID := int64(claims[conf.IdentityKey].(float64))\n\n\torders, err := client.ListOrder(ctx, userID, listReq.Status)\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tmodel.SendResponse(c, errno.Success, orders)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_user/shop_login.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_user\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// ShopLogin godoc\n// @Summary shop login\n// @Description shop login\n// @Tags shop module\n// @Accept json\n// @Produce json\n// @Param userParam body model.UserParam true \"login param\"\n// @Success 200 {object} model.LoginResponse\n// @Router /shop/login [post]\nfunc ShopLogin(ctx context.Context, c *app.RequestContext) {\n\tmodel.ShopAuthMiddleware.LoginHandler(ctx, c)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_user/user_login.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_user\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// UserLogin godoc\n// @Summary user login\n// @Description user login\n// @Tags user module\n// @Accept json\n// @Produce json\n// @Param userParam body model.UserParam true \"login param\"\n// @Success 200 {object} model.LoginResponse\n// @Router /user/login [post]\nfunc UserLogin(ctx context.Context, c *app.RequestContext) {\n\tmodel.UserAuthMiddleware.LoginHandler(ctx, c)\n}\n"
  },
  {
    "path": "book-shop/app/facade/handlers/handler_user/user_register.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler_user\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// UserRegister godoc\n// @Summary user register\n// @Description user register\n// @Tags user module\n// @Accept json\n// @Produce json\n// @Param userParam body model.UserParam true \"register param\"\n// @Success 200 {object} model.Response\n// @Router /user/register [post]\nfunc UserRegister(ctx context.Context, c *app.RequestContext) {\n\tvar registerParam model.UserParam\n\tif err := c.BindAndValidate(&registerParam); err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\n\tif len(registerParam.UserName) == 0 || len(registerParam.PassWord) == 0 {\n\t\tmodel.SendResponse(c, errno.ParamErr, nil)\n\t\treturn\n\t}\n\n\terr := client.CreateUser(ctx, &user.CreateUserReq{\n\t\tUserName: registerParam.UserName,\n\t\tPassword: registerParam.PassWord,\n\t})\n\tif err != nil {\n\t\tmodel.SendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tmodel.SendResponse(c, errno.Success, nil)\n}\n"
  },
  {
    "path": "book-shop/app/facade/infras/client/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage client\n\n// Init init rpc client\nfunc Init() {\n\tinitUserRpc()\n\tinitItemRpc()\n\tinitOrderRpc()\n}\n"
  },
  {
    "path": "book-shop/app/facade/infras/client/item.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage client\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item/itemservice\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/retry\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nvar itemClient itemservice.Client\n\nfunc initItemRpc() {\n\tr, err := etcd.NewEtcdResolver([]string{conf.EtcdAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tc, err := itemservice.NewClient(\n\t\tconf.ItemRpcServiceName,\n\t\tclient.WithRPCTimeout(3*time.Second),              // rpc timeout\n\t\tclient.WithConnectTimeout(50*time.Millisecond),    // conn timeout\n\t\tclient.WithFailureRetry(retry.NewFailurePolicy()), // retry\n\t\tclient.WithResolver(r),                            // resolver\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\titemClient = c\n}\n\nfunc AddProduct(ctx context.Context, req *item.AddReq) (int64, error) {\n\tresp, err := itemClient.Add(ctx, req)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn 0, errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.ProductId, nil\n}\n\nfunc EditProduct(ctx context.Context, req *item.EditReq) error {\n\tresp, err := itemClient.Edit(ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n\nfunc OperateProduct(ctx context.Context, productId int64, operate string) error {\n\tif operate == \"del\" {\n\t\tresp, err := itemClient.Delete(ctx, &item.DeleteReq{ProductId: productId})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif resp.BaseResp.StatusCode != 0 {\n\t\t\treturn errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t\t}\n\t} else if operate == \"offline\" {\n\t\tresp, err := itemClient.Offline(ctx, &item.OfflineReq{ProductId: productId})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif resp.BaseResp.StatusCode != 0 {\n\t\t\treturn errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t\t}\n\t} else if operate == \"online\" {\n\t\tresp, err := itemClient.Online(ctx, &item.OnlineReq{ProductId: productId})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif resp.BaseResp.StatusCode != 0 {\n\t\t\treturn errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc GetProduct(ctx context.Context, productId int64) (*item.Product, error) {\n\tresp, err := itemClient.Get(ctx, &item.GetReq{ProductId: productId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn nil, errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.Product, nil\n}\n\nfunc MGetProducts2C(ctx context.Context, productIds []int64) (map[int64]*item.Product, error) {\n\tresp, err := itemClient.MGet2C(ctx, &item.MGet2CReq{\n\t\tProductIds: productIds,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn nil, errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.ProductMap, nil\n}\n\nfunc SearchProduct(ctx context.Context, req *item.SearchReq) ([]*item.Product, error) {\n\tresp, err := itemClient.Search(ctx, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn nil, errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.Products, nil\n}\n\nfunc ListProduct(ctx context.Context, req *item.ListReq) ([]*item.Product, error) {\n\tresp, err := itemClient.List(ctx, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn nil, errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.Products, nil\n}\n"
  },
  {
    "path": "book-shop/app/facade/infras/client/order.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage client\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/retry\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nvar orderClient orderservice.Client\n\nfunc initOrderRpc() {\n\tr, err := etcd.NewEtcdResolver([]string{conf.EtcdAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tc, err := orderservice.NewClient(\n\t\tconf.OrderRpcServiceName,\n\t\tclient.WithRPCTimeout(3*time.Second),              // rpc timeout\n\t\tclient.WithConnectTimeout(50*time.Millisecond),    // conn timeout\n\t\tclient.WithFailureRetry(retry.NewFailurePolicy()), // retry\n\t\tclient.WithResolver(r),                            // resolver\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\torderClient = c\n}\n\nfunc CreateOrder(ctx context.Context, req *order.CreateOrderReq) error {\n\tresp, err := orderClient.CreateOrder(ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n\nfunc CancelOrder(ctx context.Context, orderId int64) error {\n\tresp, err := orderClient.CancelOrder(ctx, &order.CancelOrderReq{OrderId: orderId})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n\nfunc GetOrderById(ctx context.Context, orderId int64) (*order.OrderItem, error) {\n\tresp, err := orderClient.GetOrderById(ctx, &order.GetOrderByIdReq{\n\t\tOrderId: orderId,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn nil, errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.Order, nil\n}\n\nfunc ListOrder(ctx context.Context, userId int64, status *int64) ([]*order.OrderItem, error) {\n\tresp, err := orderClient.ListOrder(ctx, &order.ListOrderReq{\n\t\tUserId: userId,\n\t\tStatus: (*order.Status)(status),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn nil, errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.Orders, nil\n}\n"
  },
  {
    "path": "book-shop/app/facade/infras/client/user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage client\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user/userservice\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/retry\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nvar userClient userservice.Client\n\nfunc initUserRpc() {\n\tr, err := etcd.NewEtcdResolver([]string{conf.EtcdAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tc, err := userservice.NewClient(\n\t\tconf.UserRpcServiceName,\n\t\tclient.WithRPCTimeout(3*time.Second),              // rpc timeout\n\t\tclient.WithConnectTimeout(50*time.Millisecond),    // conn timeout\n\t\tclient.WithFailureRetry(retry.NewFailurePolicy()), // retry\n\t\tclient.WithResolver(r),                            // resolver\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tuserClient = c\n}\n\nfunc CreateUser(ctx context.Context, req *user.CreateUserReq) error {\n\tresp, err := userClient.CreateUser(ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n\nfunc CheckUser(ctx context.Context, req *user.CheckUserReq) (int64, error) {\n\tresp, err := userClient.CheckUser(ctx, req)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn 0, errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.UserId, nil\n}\n"
  },
  {
    "path": "book-shop/app/facade/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/handlers/handler_item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/handlers/handler_order\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/handlers/handler_user\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/infras/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/facade/model\"\n\t_ \"github.com/cloudwego/biz-demo/book-shop/docs\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/jwt\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/swagger\"\n\tswaggerFiles \"github.com/swaggo/files\"\n)\n\nfunc Init() {\n\tclient.Init()\n\n\tmodel.UserAuthMiddleware, _ = jwt.New(&jwt.HertzJWTMiddleware{\n\t\tKey:        []byte(conf.SecretKey),\n\t\tTimeout:    time.Hour,\n\t\tMaxRefresh: time.Hour,\n\t\tPayloadFunc: func(data interface{}) jwt.MapClaims {\n\t\t\tif v, ok := data.(int64); ok {\n\t\t\t\treturn jwt.MapClaims{\n\t\t\t\t\tconf.IdentityKey: v,\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn jwt.MapClaims{}\n\t\t},\n\t\tAuthenticator: func(ctx context.Context, c *app.RequestContext) (interface{}, error) {\n\t\t\tvar loginVar model.UserParam\n\t\t\tif err := c.Bind(&loginVar); err != nil {\n\t\t\t\treturn \"\", jwt.ErrMissingLoginValues\n\t\t\t}\n\n\t\t\tif len(loginVar.UserName) == 0 || len(loginVar.PassWord) == 0 {\n\t\t\t\treturn \"\", jwt.ErrMissingLoginValues\n\t\t\t}\n\n\t\t\treturn client.CheckUser(context.Background(), &user.CheckUserReq{UserName: loginVar.UserName, Password: loginVar.PassWord})\n\t\t},\n\t\tTokenLookup:   \"header: Authorization, query: token, cookie: jwt\",\n\t\tTokenHeadName: \"Bearer\",\n\t\tTimeFunc:      time.Now,\n\t})\n\n\tmodel.ShopAuthMiddleware, _ = jwt.New(&jwt.HertzJWTMiddleware{\n\t\tKey:        []byte(conf.SecretKey),\n\t\tTimeout:    time.Hour,\n\t\tMaxRefresh: time.Hour,\n\t\tPayloadFunc: func(data interface{}) jwt.MapClaims {\n\t\t\tif v, ok := data.(int64); ok {\n\t\t\t\treturn jwt.MapClaims{\n\t\t\t\t\tconf.IdentityKey: v,\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn jwt.MapClaims{}\n\t\t},\n\t\tAuthenticator: func(ctx context.Context, c *app.RequestContext) (interface{}, error) {\n\t\t\tvar loginVar model.UserParam\n\t\t\tif err := c.Bind(&loginVar); err != nil {\n\t\t\t\treturn \"\", jwt.ErrMissingLoginValues\n\t\t\t}\n\n\t\t\tif loginVar.UserName != conf.ShopLoginName || loginVar.PassWord != conf.ShopLoginPassword {\n\t\t\t\treturn \"\", jwt.ErrMissingLoginValues\n\t\t\t}\n\n\t\t\treturn conf.ShopLoginName, nil\n\t\t},\n\t\tTokenLookup:   \"header: Authorization, query: token, cookie: jwt\",\n\t\tTokenHeadName: \"Bearer\",\n\t\tTimeFunc:      time.Now,\n\t})\n}\n\n// @title Book-Shop\n// @version 1.0\n// @description This is a book-shop demo using Hertz and KiteX.\n\n// @contact.name CloudWeGo\n// @contact.url https://github.com/cloudwego\n// @contact.email conduct@cloudwego.io\n\n// @license.name Apache 2.0\n// @license.url http://www.apache.org/licenses/LICENSE-2.0.html\n// @securityDefinitions.apikey TokenAuth\n// @in header\n// @name Authorization\n\n// @host localhost:8080\n// @BasePath /\n// @schemes http\nfunc main() {\n\tInit()\n\th := server.Default(server.WithHostPorts(conf.FacadeServiceAddress))\n\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\tpprof.Register(h)\n\n\t// user service\n\tuserGroup := h.Group(\"/user\")\n\tuserGroup.POST(\"/register\", handler_user.UserRegister)\n\tuserGroup.POST(\"/login\", handler_user.UserLogin)\n\n\t// shop service\n\tshopGroup := h.Group(\"/shop\")\n\tshopGroup.POST(\"/login\", handler_user.ShopLogin)\n\n\t// item-2b service\n\titem2BGroup := h.Group(\"/item2b\")\n\titem2BGroup.Use(model.ShopAuthMiddleware.MiddlewareFunc())\n\titem2BGroup.POST(\"/add\", handler_item.AddProduct)\n\titem2BGroup.POST(\"/edit\", handler_item.EditProduct)\n\titem2BGroup.POST(\"/del\", handler_item.DelProduct)\n\titem2BGroup.POST(\"/offline\", handler_item.OfflineProduct)\n\titem2BGroup.POST(\"/online\", handler_item.OnlineProduct)\n\titem2BGroup.GET(\"/get\", handler_item.GetProduct)\n\titem2BGroup.POST(\"/list\", handler_item.ListProduct)\n\n\t// item-2c service\n\titem2CGroup := h.Group(\"/item2c\")\n\titem2CGroup.Use(model.UserAuthMiddleware.MiddlewareFunc())\n\titem2CGroup.GET(\"/mget\", handler_item.MGetProduct2C)\n\titem2CGroup.POST(\"/search\", handler_item.SearchProduct)\n\n\t// order service\n\torderGroup := h.Group(\"/order\")\n\torderGroup.Use(model.UserAuthMiddleware.MiddlewareFunc())\n\torderGroup.POST(\"/create\", handler_order.CreateOrder)\n\torderGroup.POST(\"/cancel\", handler_order.CancelOrder)\n\torderGroup.POST(\"/list\", handler_order.ListOrder)\n\torderGroup.GET(\"/get\", handler_order.GetOrder)\n\n\turl := swagger.URL(\"http://localhost:8080/swagger/doc.json\") // The url pointing to API definition\n\th.GET(\"/swagger/*any\", swagger.WrapHandler(swaggerFiles.Handler, url))\n\n\th.Spin()\n}\n"
  },
  {
    "path": "book-shop/app/facade/model/model.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage model\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\n\t\"github.com/hertz-contrib/jwt\"\n)\n\nvar (\n\tUserAuthMiddleware *jwt.HertzJWTMiddleware\n\tShopAuthMiddleware *jwt.HertzJWTMiddleware\n)\n\ntype Response struct {\n\tCode    int64       `json:\"code\"`\n\tMessage string      `json:\"message\"`\n\tData    interface{} `json:\"data\"`\n}\n\n// SendResponse pack response\nfunc SendResponse(c *app.RequestContext, err error, data interface{}) {\n\tErr := errno.ConvertErr(err)\n\tc.JSON(http.StatusOK, Response{\n\t\tCode:    Err.ErrCode,\n\t\tMessage: Err.ErrMsg,\n\t\tData:    data,\n\t})\n}\n\ntype UserParam struct {\n\tUserName string `json:\"username\"`\n\tPassWord string `json:\"password\"`\n}\n\ntype LoginResponse struct {\n\tCode   int64  `json:\"code\"`\n\tExpire string `json:\"expire\"`\n\tToken  string `json:\"token\"`\n}\n\ntype AddProductRequest struct {\n\tName        string `json:\"name\"`\n\tPic         string `json:\"pic\"`\n\tDescription string `json:\"description\"`\n\tISBN        string `json:\"isbn\"`\n\tSpuName     string `json:\"spu_name\"`\n\tSpuPrice    int64  `json:\"spu_price\"`\n\tPrice       int64  `json:\"price\"`\n\tStock       int64  `json:\"stock\"`\n}\n\ntype EditProductRequest struct {\n\tProductId   string  `json:\"product_id\"`\n\tName        *string `json:\"name\"`\n\tPic         *string `json:\"pic\"`\n\tDescription *string `json:\"description\"`\n\tISBN        *string `json:\"isbn\"`\n\tSpuName     *string `json:\"spu_name\"`\n\tSpuPrice    *int64  `json:\"spu_price\"`\n\tPrice       *int64  `json:\"price\"`\n\tStock       *int64  `json:\"stock\"`\n}\n\ntype OperateProductReq struct {\n\tProductId string `json:\"product_id\"`\n}\n\ntype SearchProductReq struct {\n\tName        *string `json:\"name\"`\n\tDescription *string `json:\"description\"`\n\tSpuName     *string `json:\"spu_name\"`\n}\n\ntype ListProductReq struct {\n\tName    *string `json:\"name\"`\n\tSpuName *string `json:\"spu_name\"`\n\tStatus  *int64  `json:\"status\"`\n}\n\ntype CreateOrderReq struct {\n\tAddress   string `json:\"address\"`\n\tProductId string `json:\"product_id\"`\n\tStockNum  int64  `json:\"stock_num\"`\n}\n\ntype CancelOrderReq struct {\n\tOrderId string `json:\"order_id\"`\n}\n\ntype ListOrderReq struct {\n\tStatus *int64 `json:\"status\"`\n}\n"
  },
  {
    "path": "book-shop/app/facade/run.sh",
    "content": "#!/usr/bin/env bash\n#\n# Copyright 2022 CloudWeGo Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ngo run app/facade/main.go"
  },
  {
    "path": "book-shop/app/item/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cwg.bookshop.item\"\n\nmkdir -p output/bin\ncp script/* output/\nchmod +x output/bootstrap.sh\n\nif [ \"$IS_SYSTEM_TEST_ENV\" != \"1\" ]; then\n    go build -o output/bin/${RUN_NAME}\nelse\n    go test -c -covermode=set -o output/bin/${RUN_NAME} -coverpkg=./...\nfi\n"
  },
  {
    "path": "book-shop/app/item/common/constant/constant.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage constant\n\ntype ProductStatus = int64\n\nconst (\n\tProductStatusOnline  ProductStatus = 0\n\tProductStatusOffline ProductStatus = 1\n\tProductStatusDelete  ProductStatus = 2\n)\n\nvar ProductStatusDescMap = map[ProductStatus]string{\n\tProductStatusOnline:  \"上架\",\n\tProductStatusOffline: \"下架\",\n\tProductStatusDelete:  \"删除\",\n}\n\ntype StateOperationType = int64\n\nconst (\n\tStateOperationTypeAdd     StateOperationType = 1\n\tStateOperationTypeSave    StateOperationType = 2\n\tStateOperationTypeDel     StateOperationType = 3\n\tStateOperationTypeOffline StateOperationType = 4\n\tStateOperationTypeOnline  StateOperationType = 5\n)\n"
  },
  {
    "path": "book-shop/app/item/common/converter/dto_2_entity.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage converter\n\nimport (\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/utils\"\n)\n\nfunc ConvertDTO2Entity(dto *item.Product) *entity.ProductEntity {\n\tret := &entity.ProductEntity{\n\t\tProductId:   dto.ProductId,\n\t\tName:        dto.Name,\n\t\tPic:         dto.Pic,\n\t\tDescription: dto.Description,\n\t\tPrice:       dto.Price,\n\t\tStock:       dto.Stock,\n\t\tStatus:      dto.Stock,\n\t}\n\tif dto.Property != nil {\n\t\tret.Property = &entity.PropertyEntity{\n\t\t\tISBN:     dto.Property.Isbn,\n\t\t\tSpuName:  dto.Property.SpuName,\n\t\t\tSpuPrice: dto.Property.SpuPrice,\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc ConvertAddReq2Entity(req *item.AddReq) (*entity.ProductEntity, error) {\n\tpid, err := utils.GenerateID()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret := &entity.ProductEntity{\n\t\tProductId:   pid,\n\t\tName:        req.Name,\n\t\tPic:         req.Pic,\n\t\tDescription: req.Description,\n\t\tPrice:       req.Price,\n\t\tStock:       req.Stock,\n\t\tStatus:      int64(item.Status_Online),\n\t}\n\n\tif req.Property != nil {\n\t\tret.Property = &entity.PropertyEntity{\n\t\t\tISBN:     req.Property.Isbn,\n\t\t\tSpuName:  req.Property.SpuName,\n\t\t\tSpuPrice: req.Property.SpuPrice,\n\t\t}\n\t}\n\n\treturn ret, err\n}\n\nfunc ConvertEditReq2Entity(originEntity *entity.ProductEntity, req *item.EditReq) (*entity.ProductEntity, error) {\n\ttargetEntity, err := originEntity.Clone()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif req.Name != nil {\n\t\ttargetEntity.Name = *req.Name\n\t}\n\tif req.Pic != nil {\n\t\ttargetEntity.Pic = *req.Pic\n\t}\n\tif req.Description != nil {\n\t\ttargetEntity.Description = *req.Description\n\t}\n\tif req.Price != nil {\n\t\ttargetEntity.Price = *req.Price\n\t}\n\tif req.Stock != nil {\n\t\ttargetEntity.Stock = *req.Stock\n\t}\n\tif req.Property != nil {\n\t\ttargetEntity.Property = &entity.PropertyEntity{\n\t\t\tISBN:     req.Property.Isbn,\n\t\t\tSpuName:  req.Property.SpuName,\n\t\t\tSpuPrice: req.Property.SpuPrice,\n\t\t}\n\t}\n\treturn targetEntity, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/common/converter/entity_2_dto.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage converter\n\nimport (\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n)\n\nfunc ConvertEntity2DTO(e *entity.ProductEntity) *item.Product {\n\tret := &item.Product{\n\t\tProductId:   e.ProductId,\n\t\tName:        e.Name,\n\t\tPic:         e.Pic,\n\t\tDescription: e.Description,\n\t\tPrice:       e.Price,\n\t\tStock:       e.Stock,\n\t\tStatus:      item.Status(e.Status),\n\t}\n\tif e.Property != nil {\n\t\tret.Property = &item.BookProperty{\n\t\t\tIsbn:     e.Property.ISBN,\n\t\t\tSpuName:  e.Property.SpuName,\n\t\t\tSpuPrice: e.Property.SpuPrice,\n\t\t}\n\t}\n\treturn ret\n}\n"
  },
  {
    "path": "book-shop/app/item/common/entity/product_entity.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage entity\n\nimport \"github.com/jinzhu/copier\"\n\ntype ProductEntity struct {\n\tProductId   int64\n\tName        string\n\tPic         string\n\tDescription string\n\tProperty    *PropertyEntity\n\tPrice       int64\n\tStock       int64\n\tStatus      int64\n}\n\nfunc (entity *ProductEntity) Clone() (*ProductEntity, error) {\n\tret := &ProductEntity{}\n\terr := copier.Copy(ret, entity)\n\treturn ret, err\n}\n\ntype PropertyEntity struct {\n\tISBN     string\n\tSpuName  string\n\tSpuPrice int64\n}\n"
  },
  {
    "path": "book-shop/app/item/common/po/product_po.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage po\n\nimport (\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tgorm.Model\n\tProductId   int64  `json:\"product_id\"`\n\tName        string `json:\"name\"`\n\tPic         string `json:\"pic\"`\n\tDescription string `json:\"description\"`\n\tISBN        string `json:\"isbn\"`\n\tSpuName     string `json:\"spu_name\"`\n\tSpuPrice    int64  `json:\"spu_price\"`\n\tPrice       int64  `json:\"price\"`\n\tStock       int64  `json:\"stock\"`\n\tStatus      int64  `json:\"status\"`\n}\n\nfunc (p *Product) TableName() string {\n\treturn conf.ProductTableName\n}\n"
  },
  {
    "path": "book-shop/app/item/domain/repository/product_2c_repository.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage repository\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n)\n\ntype Product2CRepository interface {\n\tMGetProducts2C(ctx context.Context, productIds []int64) ([]*entity.ProductEntity, error)\n\tSearchProducts(ctx context.Context, name, description, spuName *string) ([]*entity.ProductEntity, error)\n}\n"
  },
  {
    "path": "book-shop/app/item/domain/repository/product_repository.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage repository\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n)\n\ntype ProductRepository interface {\n\tAddProduct(ctx context.Context, product *entity.ProductEntity) error\n\n\tUpdateProduct(ctx context.Context, origin, target *entity.ProductEntity) error\n\n\tGetProductById(ctx context.Context, productId int64) (*entity.ProductEntity, error)\n\n\tListProducts(ctx context.Context, filterParam map[string]interface{}) ([]*entity.ProductEntity, error)\n}\n"
  },
  {
    "path": "book-shop/app/item/domain/repository/repository_registry.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage repository\n\ntype RepositoryRegistry struct {\n\tproductRepository   ProductRepository\n\tstockRepository     StockRepository\n\tproduct2CRepository Product2CRepository\n}\n\nvar inst = &RepositoryRegistry{}\n\nfunc GetRegistry() *RepositoryRegistry {\n\treturn inst\n}\n\nfunc (r *RepositoryRegistry) GetProductRepository() ProductRepository {\n\treturn r.productRepository\n}\n\nfunc (r *RepositoryRegistry) SetProductRepository(productRepositoryIns ProductRepository) {\n\tr.productRepository = productRepositoryIns\n}\n\nfunc (r *RepositoryRegistry) GetProduct2CRepository() Product2CRepository {\n\treturn r.product2CRepository\n}\n\nfunc (r *RepositoryRegistry) SetProduct2CRepository(product2CRepositoryIns Product2CRepository) {\n\tr.product2CRepository = product2CRepositoryIns\n}\n\nfunc (r *RepositoryRegistry) GetStockRepository() StockRepository {\n\treturn r.stockRepository\n}\n\nfunc (r *RepositoryRegistry) SetStockRepository(stockRepositoryIns StockRepository) {\n\tr.stockRepository = stockRepositoryIns\n}\n"
  },
  {
    "path": "book-shop/app/item/domain/repository/stock_repository.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage repository\n\nimport (\n\t\"context\"\n)\n\ntype StockRepository interface {\n\tIncrStock(ctx context.Context, productId, stockNum int64) error // 增加库存\n\tDecrStock(ctx context.Context, productId, stockNum int64) error // 减少库存\n}\n"
  },
  {
    "path": "book-shop/app/item/domain/service/product_query_service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/repository\"\n)\n\n// ProductQueryService product query service\ntype ProductQueryService struct{}\n\nvar productQueryService ProductQueryService\n\n// GetProductQueryServiceInstance single instance\nfunc GetProductQueryServiceInstance() *ProductQueryService {\n\treturn &productQueryService\n}\n\nfunc (s *ProductQueryService) GetProduct(ctx context.Context, productId int64) (*entity.ProductEntity, error) {\n\tdo, err := repository.GetRegistry().GetProductRepository().GetProductById(ctx, productId)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn do, nil\n}\n\nfunc (s *ProductQueryService) ListProducts(ctx context.Context, name, spuName *string, status *int64) ([]*entity.ProductEntity, error) {\n\tfilterParam := make(map[string]interface{})\n\tif name != nil {\n\t\tfilterParam[\"name\"] = *name\n\t}\n\tif spuName != nil {\n\t\tfilterParam[\"spu_name\"] = *spuName\n\t}\n\tif status != nil {\n\t\tfilterParam[\"status\"] = *status\n\t}\n\tentities, err := repository.GetRegistry().GetProductRepository().ListProducts(ctx, filterParam)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn entities, nil\n}\n\nfunc (s *ProductQueryService) MGet2C(ctx context.Context, productIds []int64) ([]*entity.ProductEntity, error) {\n\tdo, err := repository.GetRegistry().GetProduct2CRepository().MGetProducts2C(ctx, productIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn do, nil\n}\n\nfunc (s *ProductQueryService) Search(ctx context.Context, name, description, spuName *string) ([]*entity.ProductEntity, error) {\n\tdo, err := repository.GetRegistry().GetProduct2CRepository().SearchProducts(ctx, name, description, spuName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn do, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/domain/service/product_state_service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/constant\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/repository\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\n// ProductStateService product state machine service\ntype ProductStateService struct{}\n\nvar productStateService ProductStateService\n\nfunc GetProductStateService() *ProductStateService {\n\treturn &productStateService\n}\n\ntype ProductStateInfo struct {\n\tStatus constant.ProductStatus\n}\n\ntype CanTransferFunc func(originalInfo *ProductStateInfo) error\n\ntype ConstructTargetInfoFunc func(originalInfo *ProductStateInfo) *ProductStateInfo\n\nvar canTransferFuncMap = map[constant.StateOperationType]CanTransferFunc{\n\tconstant.StateOperationTypeAdd: func(originalInfo *ProductStateInfo) error {\n\t\treturn nil\n\t},\n\tconstant.StateOperationTypeSave: func(originalInfo *ProductStateInfo) error {\n\t\tif originalInfo.Status == constant.ProductStatusDelete {\n\t\t\treturn errors.New(\"商品已删除\")\n\t\t}\n\t\treturn nil\n\t},\n\tconstant.StateOperationTypeDel: func(originalInfo *ProductStateInfo) error {\n\t\treturn nil\n\t},\n\tconstant.StateOperationTypeOnline: func(originalInfo *ProductStateInfo) error {\n\t\tif originalInfo.Status != constant.ProductStatusOffline {\n\t\t\treturn errors.New(\"商品非下架状态\")\n\t\t}\n\t\treturn nil\n\t},\n\tconstant.StateOperationTypeOffline: func(originalInfo *ProductStateInfo) error {\n\t\tif originalInfo.Status != constant.ProductStatusOnline {\n\t\t\treturn errors.New(\"商品非上架状态\")\n\t\t}\n\t\treturn nil\n\t},\n}\n\nvar constructTargetInfoFuncMap = map[constant.StateOperationType]ConstructTargetInfoFunc{\n\tconstant.StateOperationTypeAdd: func(originalInfo *ProductStateInfo) (ret *ProductStateInfo) {\n\t\tret = &ProductStateInfo{}\n\t\tret.Status = constant.ProductStatusOnline\n\t\treturn\n\t},\n\tconstant.StateOperationTypeSave: func(originalInfo *ProductStateInfo) (ret *ProductStateInfo) {\n\t\tret = &ProductStateInfo{}\n\t\tret.Status = constant.ProductStatusOnline\n\t\treturn\n\t},\n\tconstant.StateOperationTypeDel: func(originalInfo *ProductStateInfo) (ret *ProductStateInfo) {\n\t\tret = &ProductStateInfo{}\n\t\tret.Status = constant.ProductStatusDelete\n\t\treturn\n\t},\n\tconstant.StateOperationTypeOnline: func(originalInfo *ProductStateInfo) (ret *ProductStateInfo) {\n\t\tret = &ProductStateInfo{}\n\t\tret.Status = constant.ProductStatusOnline\n\t\treturn\n\t},\n\tconstant.StateOperationTypeOffline: func(originalInfo *ProductStateInfo) (ret *ProductStateInfo) {\n\t\tret = &ProductStateInfo{}\n\t\tret.Status = constant.ProductStatusOffline\n\t\treturn\n\t},\n}\n\n// GetCanTransferFunc get the validating func\nfunc (s *ProductStateService) GetCanTransferFunc(operationType constant.StateOperationType) (CanTransferFunc, error) {\n\tif canTransferFunc, ok := canTransferFuncMap[operationType]; ok {\n\t\treturn canTransferFunc, nil\n\t}\n\n\treturn nil, errors.New(\"GetCanTransferFunc not found\")\n}\n\n// GetConstructTargetInfoFunc get func to change product status\nfunc (s *ProductStateService) getConstructTargetInfoFunc(operationType constant.StateOperationType) (ConstructTargetInfoFunc, error) {\n\tif constructTargetInfoFunc, ok := constructTargetInfoFuncMap[operationType]; ok {\n\t\treturn constructTargetInfoFunc, nil\n\t}\n\n\treturn nil, errors.New(\"GetConstructTargetInfoFunc not found\")\n}\n\n// ConstructTargetInfo change product status\nfunc (s *ProductStateService) ConstructTargetInfo(originProduct *entity.ProductEntity,\n\toperation constant.StateOperationType,\n) (*entity.ProductEntity, error) {\n\ttargetProduct, err := originProduct.Clone()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\toriginStateInfo := &ProductStateInfo{\n\t\tStatus: originProduct.Status,\n\t}\n\tconstructFunc, err := s.getConstructTargetInfoFunc(operation)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttargetState := constructFunc(originStateInfo)\n\ttargetProduct.Status = targetState.Status\n\treturn targetProduct, nil\n}\n\n// OperateProduct update product\nfunc (s *ProductStateService) OperateProduct(ctx context.Context, origin, target *entity.ProductEntity) error {\n\trepo := repository.GetRegistry().GetProductRepository()\n\t// update status\n\terr := repo.UpdateProduct(ctx, origin, target)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"OperateProduct err: %v\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "book-shop/app/item/domain/service/product_stock_service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/repository\"\n)\n\ntype ProductStockService struct{}\n\nvar productStockService ProductStockService\n\nfunc GetProductStockServiceInstance() *ProductStockService {\n\treturn &productStockService\n}\n\nfunc (s *ProductStockService) IncreaseStockNum(ctx context.Context, productId, incrNum int64) error {\n\treturn repository.GetRegistry().GetStockRepository().IncrStock(ctx, productId, incrNum)\n}\n\nfunc (s *ProductStockService) DecreaseStockNum(ctx context.Context, productId, decrNum int64) error {\n\treturn repository.GetRegistry().GetStockRepository().DecrStock(ctx, productId, decrNum)\n}\n"
  },
  {
    "path": "book-shop/app/item/domain/service/product_update_service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/repository\"\n)\n\n// ProductUpdateService product update service\ntype ProductUpdateService struct{}\n\nvar productUpdateService ProductUpdateService\n\nfunc GetProductUpdateServiceInstance() *ProductUpdateService {\n\treturn &productUpdateService\n}\n\nfunc (s *ProductUpdateService) AddProduct(ctx context.Context, entity *entity.ProductEntity) error {\n\terr := repository.GetRegistry().GetProductRepository().AddProduct(ctx, entity)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (s *ProductUpdateService) EditProduct(ctx context.Context, origin, target *entity.ProductEntity) error {\n\terr := repository.GetRegistry().GetProductRepository().UpdateProduct(ctx, origin, target)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/add_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/converter\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype AddHandler struct {\n\tctx   context.Context\n\tparam *item.AddReq\n}\n\nfunc NewAddHandler(ctx context.Context, req *item.AddReq) *AddHandler {\n\treturn &AddHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *AddHandler) Add() (*item.AddResp, error) {\n\tresp := &item.AddResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tupdateService := service.GetProductUpdateServiceInstance()\n\n\tentity, err := converter.ConvertAddReq2Entity(h.param)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\terr = updateService.AddProduct(h.ctx, entity)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\tresp.ProductId = entity.ProductId\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/decrease_stock_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype DecrStockHandler struct {\n\tctx   context.Context\n\tparam *item.DecrStockReq\n}\n\nfunc NewDecrStockHandler(ctx context.Context, req *item.DecrStockReq) *DecrStockHandler {\n\treturn &DecrStockHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *DecrStockHandler) DecrStock() (*item.DecrStockResp, error) {\n\tresp := &item.DecrStockResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tstockService := service.GetProductStockServiceInstance()\n\terr := stockService.DecreaseStockNum(h.ctx, h.param.ProductId, h.param.StockNum)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/decrease_stock_revert_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype DecrStockRevertHandler struct {\n\tctx   context.Context\n\tparam *item.DecrStockReq\n}\n\nfunc NewDecrStockRevertHandler(ctx context.Context, req *item.DecrStockReq) *DecrStockRevertHandler {\n\treturn &DecrStockRevertHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *DecrStockRevertHandler) DecrStockRevert() (*item.DecrStockResp, error) {\n\tresp := &item.DecrStockResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tstockService := service.GetProductStockServiceInstance()\n\terr := stockService.IncreaseStockNum(h.ctx, h.param.ProductId, h.param.StockNum)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/delete_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/constant\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype DeleteHandler struct {\n\tctx   context.Context\n\tparam *item.DeleteReq\n}\n\nfunc NewDeleteHandler(ctx context.Context, req *item.DeleteReq) *DeleteHandler {\n\treturn &DeleteHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *DeleteHandler) Delete() (*item.DeleteResp, error) {\n\tresp := &item.DeleteResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tstateService := service.GetProductStateService()\n\tqueryService := service.GetProductQueryServiceInstance()\n\tupdateService := service.GetProductUpdateServiceInstance()\n\n\t// 0. get origin info\n\toriginEntity, err := queryService.GetProduct(h.ctx, h.param.ProductId)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\t// 1. validate\n\tvalidateFunc, err := stateService.GetCanTransferFunc(constant.ProductStatusDelete)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\terr = validateFunc(&service.ProductStateInfo{Status: originEntity.Status})\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\t// 2. construct do\n\ttargetEntity, err := stateService.ConstructTargetInfo(originEntity, constant.StateOperationTypeDel)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\t// 3. process\n\terr = updateService.EditProduct(h.ctx, originEntity, targetEntity)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/edit_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/converter\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype EditHandler struct {\n\tctx   context.Context\n\tparam *item.EditReq\n}\n\nfunc NewEditHandler(ctx context.Context, req *item.EditReq) *EditHandler {\n\treturn &EditHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *EditHandler) Edit() (*item.EditResp, error) {\n\tresp := &item.EditResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tupdateService := service.GetProductUpdateServiceInstance()\n\tqueryService := service.GetProductQueryServiceInstance()\n\n\toriginEntity, err := queryService.GetProduct(h.ctx, h.param.ProductId)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\ttargetEntity, err := converter.ConvertEditReq2Entity(originEntity, h.param)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\terr = updateService.EditProduct(h.ctx, originEntity, targetEntity)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/get_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/converter\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype GetHandler struct {\n\tctx   context.Context\n\tparam *item.GetReq\n}\n\nfunc NewGetHandler(ctx context.Context, req *item.GetReq) *GetHandler {\n\treturn &GetHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *GetHandler) Get() (*item.GetResp, error) {\n\tresp := &item.GetResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tqueryService := service.GetProductQueryServiceInstance()\n\tproductEntity, err := queryService.GetProduct(h.ctx, h.param.ProductId)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\tdto := converter.ConvertEntity2DTO(productEntity)\n\tresp.Product = dto\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/list_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/converter\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype ListHandler struct {\n\tctx   context.Context\n\tparam *item.ListReq\n}\n\nfunc NewListHandler(ctx context.Context, req *item.ListReq) *ListHandler {\n\treturn &ListHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *ListHandler) List() (*item.ListResp, error) {\n\tresp := &item.ListResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tif h.param.Name == nil && h.param.SpuName == nil && h.param.Status == nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\tqueryService := service.GetProductQueryServiceInstance()\n\tentities, err := queryService.ListProducts(h.ctx, h.param.Name, h.param.SpuName, (*int64)(h.param.Status))\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\tdtos := make([]*item.Product, 0)\n\tfor _, e := range entities {\n\t\tdtos = append(dtos, converter.ConvertEntity2DTO(e))\n\t}\n\n\tresp.Products = dtos\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/mget2c_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/converter\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype MGet2CHandler struct {\n\tctx   context.Context\n\tparam *item.MGet2CReq\n}\n\nfunc NewMGet2CHandler(ctx context.Context, req *item.MGet2CReq) *MGet2CHandler {\n\treturn &MGet2CHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *MGet2CHandler) MGet() (*item.MGet2CResp, error) {\n\tresp := &item.MGet2CResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tqueryService := service.GetProductQueryServiceInstance()\n\tentities, err := queryService.MGet2C(h.ctx, h.param.ProductIds)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tdtoMap := make(map[int64]*item.Product)\n\tfor _, e := range entities {\n\t\tdtoMap[e.ProductId] = converter.ConvertEntity2DTO(e)\n\t}\n\n\tresp.ProductMap = dtoMap\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/offline_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/constant\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype OfflineHandler struct {\n\tctx   context.Context\n\tparam *item.OfflineReq\n}\n\nfunc NewOfflineHandler(ctx context.Context, req *item.OfflineReq) *OfflineHandler {\n\treturn &OfflineHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *OfflineHandler) Offline() (*item.OfflineResp, error) {\n\tresp := &item.OfflineResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tstateService := service.GetProductStateService()\n\tqueryService := service.GetProductQueryServiceInstance()\n\tupdateService := service.GetProductUpdateServiceInstance()\n\n\t// 0. get origin info\n\toriginEntity, err := queryService.GetProduct(h.ctx, h.param.ProductId)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\t// 1. validate\n\tvalidateFunc, err := stateService.GetCanTransferFunc(constant.ProductStatusOffline)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\terr = validateFunc(&service.ProductStateInfo{Status: originEntity.Status})\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\t// 2. construct do\n\ttargetEntity, err := stateService.ConstructTargetInfo(originEntity, constant.StateOperationTypeOffline)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\t// 3. process\n\terr = updateService.EditProduct(h.ctx, originEntity, targetEntity)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/online_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/constant\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype OnlineHandler struct {\n\tctx   context.Context\n\tparam *item.OnlineReq\n}\n\nfunc NewOnlineHandler(ctx context.Context, req *item.OnlineReq) *OnlineHandler {\n\treturn &OnlineHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *OnlineHandler) Online() (*item.OnlineResp, error) {\n\tresp := &item.OnlineResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tstateService := service.GetProductStateService()\n\tqueryService := service.GetProductQueryServiceInstance()\n\tupdateService := service.GetProductUpdateServiceInstance()\n\n\t// 0. get origin info\n\toriginEntity, err := queryService.GetProduct(h.ctx, h.param.ProductId)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\t// 1. validate\n\tvalidateFunc, err := stateService.GetCanTransferFunc(constant.StateOperationTypeOnline)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\terr = validateFunc(&service.ProductStateInfo{Status: originEntity.Status})\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\t// 2. construct do\n\ttargetEntity, err := stateService.ConstructTargetInfo(originEntity, constant.StateOperationTypeOnline)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\t// 3. process\n\terr = updateService.EditProduct(h.ctx, originEntity, targetEntity)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler/search_handler.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/converter\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/service\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype SearchHandler struct {\n\tctx   context.Context\n\tparam *item.SearchReq\n}\n\nfunc NewSearchHandler(ctx context.Context, req *item.SearchReq) *SearchHandler {\n\treturn &SearchHandler{\n\t\tctx:   ctx,\n\t\tparam: req,\n\t}\n}\n\nfunc (h *SearchHandler) Search() (*item.SearchResp, error) {\n\tresp := &item.SearchResp{\n\t\tBaseResp: errno.BuildBaseResp(errno.Success),\n\t}\n\n\tqueryService := service.GetProductQueryServiceInstance()\n\tentities, err := queryService.Search(h.ctx, h.param.Name, h.param.Description, h.param.SpuName)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tdtos := make([]*item.Product, 0)\n\tfor _, e := range entities {\n\t\tdtos = append(dtos, converter.ConvertEntity2DTO(e))\n\t}\n\n\tresp.Products = dtos\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/handler.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/handler\"\n\titem \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n)\n\n// ItemServiceImpl implements the last service interface defined in the IDL.\ntype ItemServiceImpl struct{}\n\n// Add implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) Add(ctx context.Context, req *item.AddReq) (resp *item.AddResp, err error) {\n\tresp, err = handler.NewAddHandler(ctx, req).Add()\n\treturn resp, err\n}\n\n// Edit implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) Edit(ctx context.Context, req *item.EditReq) (resp *item.EditResp, err error) {\n\tresp, err = handler.NewEditHandler(ctx, req).Edit()\n\treturn resp, err\n}\n\n// Delete implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) Delete(ctx context.Context, req *item.DeleteReq) (resp *item.DeleteResp, err error) {\n\tresp, err = handler.NewDeleteHandler(ctx, req).Delete()\n\treturn resp, err\n}\n\n// Online implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) Online(ctx context.Context, req *item.OnlineReq) (resp *item.OnlineResp, err error) {\n\tresp, err = handler.NewOnlineHandler(ctx, req).Online()\n\treturn resp, err\n}\n\n// Offline implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) Offline(ctx context.Context, req *item.OfflineReq) (resp *item.OfflineResp, err error) {\n\tresp, err = handler.NewOfflineHandler(ctx, req).Offline()\n\treturn resp, err\n}\n\n// Get implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) Get(ctx context.Context, req *item.GetReq) (resp *item.GetResp, err error) {\n\tresp, err = handler.NewGetHandler(ctx, req).Get()\n\treturn resp, err\n}\n\n// Search implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) Search(ctx context.Context, req *item.SearchReq) (resp *item.SearchResp, err error) {\n\tresp, err = handler.NewSearchHandler(ctx, req).Search()\n\treturn resp, err\n}\n\n// List implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) List(ctx context.Context, req *item.ListReq) (resp *item.ListResp, err error) {\n\tresp, err = handler.NewListHandler(ctx, req).List()\n\treturn resp, err\n}\n\n// MGet2C implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) MGet2C(ctx context.Context, req *item.MGet2CReq) (resp *item.MGet2CResp, err error) {\n\tresp, err = handler.NewMGet2CHandler(ctx, req).MGet()\n\treturn resp, err\n}\n\n// DecrStock implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) DecrStock(ctx context.Context, req *item.DecrStockReq) (resp *item.DecrStockResp, err error) {\n\tresp, err = handler.NewDecrStockHandler(ctx, req).DecrStock()\n\treturn resp, err\n}\n\n// DecrStockRevert implements the ItemServiceImpl interface.\nfunc (s *ItemServiceImpl) DecrStockRevert(ctx context.Context, req *item.DecrStockReq) (resp *item.DecrStockResp, err error) {\n\tresp, err = handler.NewDecrStockRevertHandler(ctx, req).DecrStockRevert()\n\treturn resp, err\n}\n"
  },
  {
    "path": "book-shop/app/item/infras/es/client.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage es\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\t\"sync\"\n\n\t\"github.com/bytedance/sonic\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/olivere/elastic/v7\"\n)\n\n// ES client\nvar (\n\tesOnce sync.Once\n\tesCli  *elastic.Client\n)\n\n// GetESClient get ES client\nfunc GetESClient() *elastic.Client {\n\tif esCli != nil {\n\t\treturn esCli\n\t}\n\n\tesOnce.Do(func() {\n\t\tcli, err := elastic.NewSimpleClient(\n\t\t\telastic.SetURL(conf.ESAddress),\n\t\t)\n\t\tif err != nil {\n\t\t\tpanic(\"new es client failed, err=\" + err.Error())\n\t\t}\n\t\tesCli = cli\n\t})\n\treturn esCli\n}\n\nfunc UpsertProductES(ctx context.Context, productId int64, product *entity.ProductEntity) error {\n\tdoc := getDocFromEntity(product)\n\t_, err := GetESClient().Update().Index(conf.ProductESIndex).Id(strconv.FormatInt(productId, 10)).Doc(doc).Upsert(doc).Refresh(\"true\").Do(ctx)\n\treturn err\n}\n\nfunc BatchGetProductById(ctx context.Context, productIds []int64) ([]*entity.ProductEntity, error) {\n\tmgetSvc := GetESClient().MultiGet()\n\tfor _, id := range productIds {\n\t\tmgetSvc.Add(elastic.NewMultiGetItem().\n\t\t\tIndex(conf.ProductESIndex).\n\t\t\tId(strconv.FormatInt(id, 10)))\n\t}\n\trsp, err := mgetSvc.Do(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tentities := make([]*entity.ProductEntity, 0)\n\tfor _, doc := range rsp.Docs {\n\t\tentities = append(entities, getEntityFromSource(string(doc.Source)))\n\t}\n\treturn entities, nil\n}\n\nfunc SearchProduct(ctx context.Context, filter map[string]interface{}) ([]*entity.ProductEntity, error) {\n\tboolQuery := elastic.NewBoolQuery()\n\tfor k, v := range filter {\n\t\tboolQuery.Must(elastic.NewMatchQuery(k, v))\n\t}\n\tsearchResult, err := GetESClient().Search().\n\t\tIndex(conf.ProductESIndex).\n\t\tQuery(boolQuery).\n\t\tSize(10000).\n\t\tFrom(0).\n\t\tDo(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif searchResult.Hits.TotalHits.Value <= 0 || len(searchResult.Hits.Hits) <= 0 {\n\t\treturn []*entity.ProductEntity{}, nil\n\t}\n\tret := make([]*entity.ProductEntity, 0)\n\tfor _, hit := range searchResult.Hits.Hits {\n\t\tret = append(ret, getEntityFromSource(string(hit.Source)))\n\t}\n\treturn ret, nil\n}\n\nfunc getEntityFromSource(source string) *entity.ProductEntity {\n\tsourceMap := make(map[string]interface{})\n\t_ = sonic.UnmarshalString(source, &sourceMap)\n\tret := &entity.ProductEntity{\n\t\tProductId:   int64(sourceMap[\"product_id\"].(float64)),\n\t\tName:        sourceMap[\"name\"].(string),\n\t\tPic:         sourceMap[\"pic\"].(string),\n\t\tDescription: sourceMap[\"description\"].(string),\n\t\tProperty: &entity.PropertyEntity{\n\t\t\tISBN:     sourceMap[\"isbn\"].(string),\n\t\t\tSpuName:  sourceMap[\"spu_name\"].(string),\n\t\t\tSpuPrice: int64(sourceMap[\"spu_price\"].(float64)),\n\t\t},\n\t\tPrice:  int64(sourceMap[\"price\"].(float64)),\n\t\tStock:  int64(sourceMap[\"stock\"].(float64)),\n\t\tStatus: int64(sourceMap[\"status\"].(float64)),\n\t}\n\treturn ret\n}\n\nfunc getDocFromEntity(e *entity.ProductEntity) map[string]interface{} {\n\tret := map[string]interface{}{\n\t\t\"product_id\":  e.ProductId,\n\t\t\"name\":        e.Name,\n\t\t\"pic\":         e.Pic,\n\t\t\"description\": e.Description,\n\t\t\"price\":       e.Price,\n\t\t\"stock\":       e.Stock,\n\t\t\"status\":      e.Status,\n\t}\n\tif e.Property != nil {\n\t\tret[\"isbn\"] = e.Property.ISBN\n\t\tret[\"spu_name\"] = e.Property.SpuName\n\t\tret[\"spu_price\"] = e.Property.SpuPrice\n\t}\n\treturn ret\n}\n"
  },
  {
    "path": "book-shop/app/item/infras/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage infras\n\nimport \"github.com/cloudwego/biz-demo/book-shop/app/item/infras/repository\"\n\nfunc Init() {\n\trepository.Init()\n}\n"
  },
  {
    "path": "book-shop/app/item/infras/repository/converter/product_do_2_po.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage converter\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/po\"\n)\n\ntype productDO2POConverter struct{}\n\nvar ProductDO2POConverter = &productDO2POConverter{}\n\nfunc (converter *productDO2POConverter) Convert2po(ctx context.Context, do *entity.ProductEntity) (*po.Product, error) {\n\tpo := &po.Product{\n\t\tProductId:   do.ProductId,\n\t\tName:        do.Name,\n\t\tPic:         do.Pic,\n\t\tDescription: do.Description,\n\t\tISBN:        \"\",\n\t\tSpuName:     \"\",\n\t\tSpuPrice:    0,\n\t\tPrice:       do.Price,\n\t\tStock:       do.Stock,\n\t\tStatus:      do.Status,\n\t}\n\tif do.Property != nil {\n\t\tpo.ISBN = do.Property.ISBN\n\t\tpo.SpuName = do.Property.SpuName\n\t\tpo.SpuPrice = do.Property.SpuPrice\n\t}\n\n\treturn po, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/infras/repository/converter/product_po_2_do.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage converter\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/po\"\n)\n\ntype productPO2DOConverter struct{}\n\nvar ProductPO2DOConverter = productPO2DOConverter{}\n\nfunc (converter *productPO2DOConverter) Convert2do(ctx context.Context, po *po.Product) (*entity.ProductEntity, error) {\n\tdo := &entity.ProductEntity{\n\t\tProductId:   po.ProductId,\n\t\tName:        po.Name,\n\t\tPic:         po.Pic,\n\t\tDescription: po.Description,\n\t\tProperty: &entity.PropertyEntity{\n\t\t\tISBN:     po.ISBN,\n\t\t\tSpuName:  po.SpuName,\n\t\t\tSpuPrice: po.SpuPrice,\n\t\t},\n\t\tPrice:  po.Price,\n\t\tStock:  po.Stock,\n\t\tStatus: po.Status,\n\t}\n\n\treturn do, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/infras/repository/differ/po_diff.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage differ\n\nimport (\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/po\"\n\t\"github.com/r3labs/diff/v2\"\n)\n\ntype productPODiffer struct{}\n\nvar ProductPODiffer *productPODiffer\n\nfunc (differ *productPODiffer) GetChangedMap(origin, target *po.Product) map[string]interface{} {\n\td, _ := diff.NewDiffer(diff.TagName(\"json\"))\n\tchangedMap := make(map[string]interface{})\n\tchangeLog, _ := d.Diff(origin, target)\n\tfor _, change := range changeLog {\n\t\tif depth := len(change.Path); depth != 1 {\n\t\t\tcontinue\n\t\t}\n\t\tif change.Type == diff.UPDATE {\n\t\t\tchangedMap[change.Path[0]] = change.To\n\t\t}\n\t}\n\treturn changedMap\n}\n"
  },
  {
    "path": "book-shop/app/item/infras/repository/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage repository\n\nimport (\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/domain/repository\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar DB *gorm.DB\n\nfunc register() {\n\tproductRepository := ProductRepositoryImpl{}\n\tstockRepository := StockRepositoryImpl{}\n\tproduct2CRepository := Product2CRepositoryImpl{}\n\trepository.GetRegistry().SetProductRepository(productRepository)\n\trepository.GetRegistry().SetStockRepository(stockRepository)\n\trepository.GetRegistry().SetProduct2CRepository(product2CRepository)\n}\n\nfunc initDB() {\n\tvar err error\n\tDB, err = gorm.Open(mysql.Open(conf.MySQLDefaultDSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc Init() {\n\tregister()\n\tinitDB()\n}\n"
  },
  {
    "path": "book-shop/app/item/infras/repository/product_2c_repo_impl.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage repository\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/infras/es\"\n)\n\ntype Product2CRepositoryImpl struct{}\n\nfunc (i Product2CRepositoryImpl) MGetProducts2C(ctx context.Context, productIds []int64) ([]*entity.ProductEntity, error) {\n\tentities, err := es.BatchGetProductById(ctx, productIds)\n\treturn entities, err\n}\n\nfunc (i Product2CRepositoryImpl) SearchProducts(ctx context.Context, name, description, spuName *string) ([]*entity.ProductEntity, error) {\n\tfilterMap := make(map[string]interface{})\n\tif name != nil {\n\t\tfilterMap[\"name\"] = *name\n\t}\n\tif description != nil {\n\t\tfilterMap[\"description\"] = *description\n\t}\n\tif spuName != nil {\n\t\tfilterMap[\"spu_name\"] = *spuName\n\t}\n\tentities, err := es.SearchProduct(ctx, filterMap)\n\treturn entities, err\n}\n"
  },
  {
    "path": "book-shop/app/item/infras/repository/product_repo_impl.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage repository\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/entity\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/po\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/infras/es\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/infras/repository/converter\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/infras/repository/differ\"\n)\n\ntype ProductRepositoryImpl struct{}\n\nfunc (i ProductRepositoryImpl) AddProduct(ctx context.Context, product *entity.ProductEntity) error {\n\tif product == nil {\n\t\treturn errors.New(\"插入数据不可为空\")\n\t}\n\tpo, err := converter.ProductDO2POConverter.Convert2po(ctx, product)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// update es async\n\tgo func() {\n\t\terr := es.UpsertProductES(ctx, po.ProductId, product)\n\t\tif err != nil {\n\t\t\tklog.CtxErrorf(ctx, \"UpsertProductES err: %v\", err)\n\t\t}\n\t}()\n\treturn DB.WithContext(ctx).Create(po).Error\n}\n\nfunc (i ProductRepositoryImpl) UpdateProduct(ctx context.Context, origin, target *entity.ProductEntity) error {\n\tproductId := target.ProductId\n\toriginPO, err := converter.ProductDO2POConverter.Convert2po(ctx, origin)\n\tif err != nil {\n\t\treturn err\n\t}\n\ttargetPO, err := converter.ProductDO2POConverter.Convert2po(ctx, target)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// update es async\n\tgo func() {\n\t\terr := es.UpsertProductES(ctx, productId, target)\n\t\tif err != nil {\n\t\t\tklog.CtxErrorf(ctx, \"UpsertProductES err: %v\", err)\n\t\t}\n\t}()\n\tchangeMap := differ.ProductPODiffer.GetChangedMap(originPO, targetPO)\n\treturn DB.WithContext(ctx).Model(&po.Product{}).Where(\"product_id = ?\", productId).\n\t\tUpdates(changeMap).Error\n}\n\nfunc (i ProductRepositoryImpl) GetProductById(ctx context.Context, productId int64) (*entity.ProductEntity, error) {\n\tproducts := make([]*po.Product, 0)\n\terr := DB.WithContext(ctx).Where(\"product_id = ?\", productId).Find(&products).Error\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(products) == 0 {\n\t\treturn nil, errors.New(\"该商品不存在\")\n\t}\n\tdo, err := converter.ProductPO2DOConverter.Convert2do(ctx, products[0])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn do, nil\n}\n\nfunc (i ProductRepositoryImpl) ListProducts(ctx context.Context, filterParam map[string]interface{}) ([]*entity.ProductEntity, error) {\n\tproducts := make([]*po.Product, 0)\n\tproductEntities := make([]*entity.ProductEntity, 0)\n\tDB = DB.Debug().WithContext(ctx)\n\tfor k, v := range filterParam {\n\t\tDB = DB.Where(k+\" = ?\", v)\n\t}\n\tif err := DB.Find(&products).Error; err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, v := range products {\n\t\tentity, err := converter.ProductPO2DOConverter.Convert2do(ctx, v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tproductEntities = append(productEntities, entity)\n\t}\n\treturn productEntities, nil\n}\n"
  },
  {
    "path": "book-shop/app/item/infras/repository/stock_repo_impl.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage repository\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/common/po\"\n\t\"gorm.io/gorm/clause\"\n)\n\ntype StockRepositoryImpl struct{}\n\nfunc (i StockRepositoryImpl) IncrStock(ctx context.Context, productId, stockNum int64) error {\n\treturn i.updateStock(ctx, productId, stockNum, \"incr\")\n}\n\nfunc (i StockRepositoryImpl) DecrStock(ctx context.Context, productId, stockNum int64) error {\n\treturn i.updateStock(ctx, productId, stockNum, \"decr\")\n}\n\nfunc (i StockRepositoryImpl) updateStock(ctx context.Context, productId, stockNum int64, updateType string) error {\n\tproductPOArr := make([]*po.Product, 0)\n\n\ttx := DB.Begin().WithContext(ctx)\n\tif tx.Error != nil {\n\t\treturn tx.Error\n\t}\n\t// select for update\n\tif err := tx.Clauses(clause.Locking{Strength: \"Update\"}).Where(\"product_id = ?\", productId).Find(&productPOArr).Error; err != nil {\n\t\ttx.Rollback()\n\t\treturn err\n\t}\n\tif len(productPOArr) == 0 {\n\t\ttx.Rollback()\n\t\treturn errors.New(\"item not found\")\n\t}\n\n\tproductPO := productPOArr[0]\n\tcurStockNum := productPO.Stock\n\tif updateType == \"incr\" {\n\t\tcurStockNum += stockNum\n\t} else if updateType == \"decr\" {\n\t\tcurStockNum -= stockNum\n\t}\n\tif curStockNum < 0 {\n\t\ttx.Rollback()\n\t\treturn errors.New(\"库存不足\")\n\t}\n\tif err := tx.Model(&po.Product{}).Where(\"product_id = ?\", productId).\n\t\tUpdates(map[string]interface{}{\n\t\t\t\"stock\": curStockNum,\n\t\t}).Error; err != nil {\n\t\ttx.Rollback()\n\t\treturn err\n\t}\n\n\ttx.Commit()\n\treturn nil\n}\n"
  },
  {
    "path": "book-shop/app/item/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"log\"\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/item/infras\"\n\titem \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item/itemservice\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nfunc Init() {\n\tinfras.Init()\n}\n\nfunc main() {\n\tInit()\n\n\tr, err := etcd.NewEtcdRegistry([]string{conf.EtcdAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.ItemServiceAddress)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tsvr := item.NewServer(new(ItemServiceImpl),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.ItemRpcServiceName}), // server name\n\t\tserver.WithServiceAddr(addr), // address\n\t\tserver.WithRegistry(r),       // registry\n\t)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tlog.Println(err.Error())\n\t}\n}\n"
  },
  {
    "path": "book-shop/app/item/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\n\nif [ \"X$1\" != \"X\" ]; then\n    RUNTIME_ROOT=$1\nelse\n    RUNTIME_ROOT=${CURDIR}\nfi\n\nexport KITEX_RUNTIME_ROOT=$RUNTIME_ROOT\nexport KITEX_LOG_DIR=\"$RUNTIME_ROOT/log\"\n\nif [ ! -d \"$KITEX_LOG_DIR/app\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/app\"\nfi\n\nif [ ! -d \"$KITEX_LOG_DIR/rpc\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/rpc\"\nfi\n\nexec \"$CURDIR/bin/cwg.bookshop.item\"\n"
  },
  {
    "path": "book-shop/app/order/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cwg.bookshop.order\"\n\nmkdir -p output/bin\ncp script/* output/\nchmod +x output/bootstrap.sh\n\nif [ \"$IS_SYSTEM_TEST_ENV\" != \"1\" ]; then\n    go build -o output/bin/${RUN_NAME}\nelse\n    go test -c -covermode=set -o output/bin/${RUN_NAME} -coverpkg=./...\nfi\n"
  },
  {
    "path": "book-shop/app/order/common/converter.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage common\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/dal/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/dal/db\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/utils\"\n)\n\nfunc ConvertCreateReq2PO(ctx context.Context, req *order.CreateOrderReq) (*db.Order, error) {\n\torderId, err := utils.GenerateID()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsnapshot, err := client.GetProductSnapshot(ctx, req.GetProductId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret := &db.Order{\n\t\tOrderId:         orderId,\n\t\tUserId:          req.UserId,\n\t\tAddress:         req.Address,\n\t\tProductId:       req.ProductId,\n\t\tStockNum:        req.StockNum,\n\t\tProductSnapshot: snapshot,\n\t\tStatus:          int64(order.Status_Finish),\n\t}\n\treturn ret, nil\n}\n\nfunc ConvertPO2DTO(ctx context.Context, po *db.Order) *order.OrderItem {\n\tret := &order.OrderItem{\n\t\tOrderId:         po.OrderId,\n\t\tUserId:          po.UserId,\n\t\tUserName:        \"\",\n\t\tAddress:         po.Address,\n\t\tProductId:       po.ProductId,\n\t\tStockNum:        po.StockNum,\n\t\tProductSnapshot: po.ProductSnapshot,\n\t\tStatus:          order.Status(po.Status),\n\t\tCreateTime:      po.CreatedAt.Unix(),\n\t\tUpdateTime:      po.UpdatedAt.Unix(),\n\t}\n\tuserName, err := client.GetUserName(ctx, po.UserId)\n\tif err == nil {\n\t\tret.UserName = userName\n\t}\n\n\treturn ret\n}\n"
  },
  {
    "path": "book-shop/app/order/dal/client/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage client\n\nfunc Init() {\n\tinitItemRpc()\n\tinitUserRpc()\n}\n"
  },
  {
    "path": "book-shop/app/order/dal/client/item.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage client\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/bytedance/sonic\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item/itemservice\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/retry\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nvar itemClient itemservice.Client\n\nfunc initItemRpc() {\n\tr, err := etcd.NewEtcdResolver([]string{conf.EtcdAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tc, err := itemservice.NewClient(\n\t\tconf.ItemRpcServiceName,\n\t\tclient.WithRPCTimeout(3*time.Second),              // rpc timeout\n\t\tclient.WithConnectTimeout(50*time.Millisecond),    // conn timeout\n\t\tclient.WithFailureRetry(retry.NewFailurePolicy()), // retry\n\t\tclient.WithResolver(r),                            // resolver\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\titemClient = c\n}\n\nfunc DecreaseStock(ctx context.Context, productId, stockNum int64) error {\n\treq := &item.DecrStockReq{\n\t\tProductId: productId,\n\t\tStockNum:  stockNum,\n\t}\n\tresp, err := itemClient.DecrStock(ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n\nfunc DecreaseStockRevert(ctx context.Context, productId, stockNum int64) error {\n\treq := &item.DecrStockReq{\n\t\tProductId: productId,\n\t\tStockNum:  stockNum,\n\t}\n\tresp, err := itemClient.DecrStockRevert(ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n\nfunc GetProductSnapshot(ctx context.Context, productId int64) (string, error) {\n\treq := &item.MGet2CReq{ProductIds: []int64{productId}}\n\tresp, err := itemClient.MGet2C(ctx, req)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn \"\", errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\tif _, ok := resp.ProductMap[productId]; !ok {\n\t\treturn \"\", errors.New(\"该商品不存在\")\n\t}\n\tproductStr, err := sonic.MarshalString(resp.ProductMap[productId])\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn productStr, nil\n}\n"
  },
  {
    "path": "book-shop/app/order/dal/client/user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage client\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user/userservice\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/retry\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nvar userClient userservice.Client\n\nfunc initUserRpc() {\n\tr, err := etcd.NewEtcdResolver([]string{conf.EtcdAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tc, err := userservice.NewClient(\n\t\tconf.UserRpcServiceName,\n\t\tclient.WithRPCTimeout(3*time.Second),              // rpc timeout\n\t\tclient.WithConnectTimeout(50*time.Millisecond),    // conn timeout\n\t\tclient.WithFailureRetry(retry.NewFailurePolicy()), // retry\n\t\tclient.WithResolver(r),                            // resolver\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tuserClient = c\n}\n\nfunc GetUserName(ctx context.Context, userId int64) (string, error) {\n\treq := &user.MGetUserReq{Ids: []int64{userId}}\n\tresp, err := userClient.MGetUser(ctx, req)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn \"\", errno.NewErrNo(int64(resp.BaseResp.StatusCode), resp.BaseResp.StatusMessage)\n\t}\n\tif len(resp.Users) > 0 {\n\t\treturn resp.Users[0].UserName, nil\n\t}\n\treturn \"\", nil\n}\n"
  },
  {
    "path": "book-shop/app/order/dal/db/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage db\n\nimport (\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar DB *gorm.DB\n\n// Init init DB\nfunc Init() {\n\tvar err error\n\tDB, err = gorm.Open(mysql.Open(conf.MySQLDefaultDSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "book-shop/app/order/dal/db/order.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage db\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"gorm.io/gorm\"\n)\n\ntype Order struct {\n\tgorm.Model\n\tOrderId         int64  `json:\"order_id\"`\n\tUserId          int64  `json:\"user_id\"`\n\tAddress         string `json:\"address\"`\n\tProductId       int64  `json:\"product_id\"`\n\tStockNum        int64  `json:\"stock_num\"`\n\tProductSnapshot string `json:\"product_snapshot\"`\n\tStatus          int64  `json:\"status\"`\n}\n\nfunc (o *Order) TableName() string {\n\treturn conf.OrderTableName\n}\n\nfunc CreateOrder(ctx context.Context, orders []*Order) error {\n\treturn DB.WithContext(ctx).Create(orders).Error\n}\n\nfunc UpdateOrder(ctx context.Context, orderId int64, updateMap map[string]interface{}) error {\n\treturn DB.WithContext(ctx).Model(&Order{}).Where(\"order_id = ?\", orderId).\n\t\tUpdates(updateMap).Error\n}\n\nfunc ListOrders(ctx context.Context, filterMap map[string]interface{}) ([]*Order, error) {\n\tres := make([]*Order, 0)\n\tdb := DB.WithContext(ctx)\n\tfor k, v := range filterMap {\n\t\tdb = db.Where(k+\" = ?\", v)\n\t}\n\terr := db.Find(&res).Error\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\nfunc GetOrderById(ctx context.Context, orderId int64) (*Order, error) {\n\tres := make([]*Order, 0)\n\terr := DB.WithContext(ctx).Where(\"order_id = ?\", orderId).Find(&res).Error\n\tif err != nil && err != gorm.ErrRecordNotFound {\n\t\treturn nil, err\n\t}\n\tif len(res) == 0 {\n\t\treturn nil, errors.New(\"不存在该订单\")\n\t}\n\treturn res[0], nil\n}\n"
  },
  {
    "path": "book-shop/app/order/handler.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/common\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/module\"\n\torder \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\n// OrderServiceImpl implements the last service interface defined in the IDL.\ntype OrderServiceImpl struct{}\n\n// CreateOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) CreateOrder(ctx context.Context, req *order.CreateOrderReq) (resp *order.CreateOrderResp, err error) {\n\tresp = order.NewCreateOrderResp()\n\tupdateModule := module.NewUpdateModule(ctx)\n\terr = updateModule.CreateOrder(req)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.BaseResp = errno.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n\n// CancelOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) CancelOrder(ctx context.Context, req *order.CancelOrderReq) (resp *order.CancelOrderResp, err error) {\n\tresp = order.NewCancelOrderResp()\n\tupdateModule := module.NewUpdateModule(ctx)\n\terr = updateModule.CancelOrder(req)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.BaseResp = errno.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n\n// ListOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) ListOrder(ctx context.Context, req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\tresp = order.NewListOrderResp()\n\tqueryModule := module.NewQueryModule(ctx)\n\tpos, err := queryModule.ListOrder(req.UserId, (*int64)(req.Status))\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\torders := make([]*order.OrderItem, 0)\n\tfor _, v := range pos {\n\t\torders = append(orders, common.ConvertPO2DTO(ctx, v))\n\t}\n\tresp.Orders = orders\n\tresp.BaseResp = errno.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n\n// GetOrderById implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) GetOrderById(ctx context.Context, req *order.GetOrderByIdReq) (resp *order.GetOrderByIdResp, err error) {\n\tresp = order.NewGetOrderByIdResp()\n\tqueryModule := module.NewQueryModule(ctx)\n\tpo, err := queryModule.GetOrderById(req.OrderId)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.Order = common.ConvertPO2DTO(ctx, po)\n\tresp.BaseResp = errno.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/order/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/dal/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/dal/db\"\n\torder \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nfunc Init() {\n\tclient.Init()\n\tdb.Init()\n}\n\nfunc main() {\n\tInit()\n\tr, err := etcd.NewEtcdRegistry([]string{conf.EtcdAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.OrderServiceAddress)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tsvr := order.NewServer(new(OrderServiceImpl),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.OrderRpcServiceName}), // server name\n\t\tserver.WithServiceAddr(addr), // address\n\t\tserver.WithRegistry(r),       // registry\n\t)\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "book-shop/app/order/module/order_query_module.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage module\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/dal/db\"\n)\n\ntype QueryModule struct {\n\tctx context.Context\n}\n\nfunc NewQueryModule(ctx context.Context) QueryModule {\n\treturn QueryModule{\n\t\tctx: ctx,\n\t}\n}\n\nfunc (m QueryModule) ListOrder(userId int64, status *int64) ([]*db.Order, error) {\n\tfilter := make(map[string]interface{})\n\tfilter[\"user_id\"] = userId\n\tif status != nil {\n\t\tfilter[\"status\"] = *status\n\t}\n\tres, err := db.ListOrders(m.ctx, filter)\n\treturn res, err\n}\n\nfunc (m QueryModule) GetOrderById(orderId int64) (*db.Order, error) {\n\tpo, err := db.GetOrderById(m.ctx, orderId)\n\treturn po, err\n}\n"
  },
  {
    "path": "book-shop/app/order/module/order_update_module.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage module\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/common\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/dal/client\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/order/dal/db\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order\"\n)\n\ntype UpdateModule struct {\n\tctx context.Context\n}\n\nfunc NewUpdateModule(ctx context.Context) UpdateModule {\n\treturn UpdateModule{\n\t\tctx: ctx,\n\t}\n}\n\nfunc (m UpdateModule) CreateOrder(req *order.CreateOrderReq) error {\n\tpo, err := common.ConvertCreateReq2PO(m.ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// 扣减库存\n\terr = client.DecreaseStock(m.ctx, req.ProductId, req.StockNum)\n\tif err != nil {\n\t\treturn err\n\t}\n\tpoList := make([]*db.Order, 0)\n\tpoList = append(poList, po)\n\t// 插入数据\n\terr = db.CreateOrder(m.ctx, poList)\n\tif err != nil {\n\t\t// 回滚\n\t\tm.createRollback(req)\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (m UpdateModule) createRollback(req *order.CreateOrderReq) {\n\t_ = client.DecreaseStockRevert(m.ctx, req.ProductId, req.StockNum)\n}\n\nfunc (m UpdateModule) CancelOrder(req *order.CancelOrderReq) error {\n\tupdateMap := map[string]interface{}{\n\t\t\"status\": int64(order.Status_Cancel),\n\t}\n\torderPO, err := db.GetOrderById(m.ctx, req.OrderId)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// 库存返还\n\terr = client.DecreaseStockRevert(m.ctx, orderPO.ProductId, orderPO.StockNum)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// 修改状态\n\terr = db.UpdateOrder(m.ctx, req.OrderId, updateMap)\n\tif err != nil {\n\t\tm.cancelRollback(orderPO.ProductId, orderPO.StockNum)\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (m UpdateModule) cancelRollback(productId, stockNum int64) {\n\t_ = client.DecreaseStock(m.ctx, productId, stockNum)\n}\n"
  },
  {
    "path": "book-shop/app/order/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\n\nif [ \"X$1\" != \"X\" ]; then\n    RUNTIME_ROOT=$1\nelse\n    RUNTIME_ROOT=${CURDIR}\nfi\n\nexport KITEX_RUNTIME_ROOT=$RUNTIME_ROOT\nexport KITEX_LOG_DIR=\"$RUNTIME_ROOT/log\"\n\nif [ ! -d \"$KITEX_LOG_DIR/app\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/app\"\nfi\n\nif [ ! -d \"$KITEX_LOG_DIR/rpc\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/rpc\"\nfi\n\nexec \"$CURDIR/bin/cwg.bookshop.order\"\n"
  },
  {
    "path": "book-shop/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cwg.bookshop.user\"\n\nmkdir -p output/bin\ncp script/* output/\nchmod +x output/bootstrap.sh\n\nif [ \"$IS_SYSTEM_TEST_ENV\" != \"1\" ]; then\n    go build -o output/bin/${RUN_NAME}\nelse\n    go test -c -covermode=set -o output/bin/${RUN_NAME} -coverpkg=./...\nfi\n"
  },
  {
    "path": "book-shop/app/user/handler.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/user/service\"\n\tuser \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// CreateUser implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) CreateUser(ctx context.Context, req *user.CreateUserReq) (resp *user.CreateUserResp, err error) {\n\tresp = user.NewCreateUserResp()\n\n\tif len(req.GetUserName()) == 0 || len(req.GetPassword()) == 0 {\n\t\tresp.BaseResp = errno.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\terr = service.NewUserService(ctx).CreateUser(req)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.BaseResp = errno.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n\n// MGetUser implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) MGetUser(ctx context.Context, req *user.MGetUserReq) (resp *user.MGetUserResp, err error) {\n\tresp = user.NewMGetUserResp()\n\n\tif len(req.Ids) == 0 {\n\t\tresp.BaseResp = errno.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\tusers, err := service.NewUserService(ctx).MGetUser(req)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.Users = users\n\tresp.BaseResp = errno.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n\n// CheckUser implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) CheckUser(ctx context.Context, req *user.CheckUserReq) (resp *user.CheckUserResp, err error) {\n\tresp = user.NewCheckUserResp()\n\n\tif len(req.Password) == 0 || len(req.UserName) == 0 {\n\t\tresp.BaseResp = errno.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\tuserId, err := service.NewUserService(ctx).CheckUser(req)\n\tif err != nil {\n\t\tresp.BaseResp = errno.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.UserId = userId\n\tresp.BaseResp = errno.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n"
  },
  {
    "path": "book-shop/app/user/infras/db/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage db\n\nimport (\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar DB *gorm.DB\n\n// Init init DB\nfunc Init() {\n\tvar err error\n\tDB, err = gorm.Open(mysql.Open(conf.MySQLDefaultDSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "book-shop/app/user/infras/db/user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage db\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tgorm.Model\n\tUserName string `json:\"user_name\"`\n\tPassword string `json:\"password\"`\n}\n\nfunc (u *User) TableName() string {\n\treturn conf.UserTableName\n}\n\n// MGetUsers multiple get list of user info\nfunc MGetUsers(ctx context.Context, userIDs []int64) ([]*User, error) {\n\tres := make([]*User, 0)\n\tif len(userIDs) == 0 {\n\t\treturn res, nil\n\t}\n\n\tif err := DB.WithContext(ctx).Where(\"id in ?\", userIDs).Find(&res).Error; err != nil {\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// CreateUser create user info\nfunc CreateUser(ctx context.Context, users []*User) error {\n\treturn DB.WithContext(ctx).Create(users).Error\n}\n\n// QueryUser query list of user info\nfunc QueryUser(ctx context.Context, userName string) ([]*User, error) {\n\tres := make([]*User, 0)\n\terr := DB.WithContext(ctx).Where(\"user_name = ?\", userName).Find(&res).Error\n\tif err != nil && err != gorm.ErrRecordNotFound {\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "book-shop/app/user/infras/redis/client.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage redis\n\nimport (\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\tredigo \"github.com/gomodule/redigo/redis\"\n)\n\nvar pool *redigo.Pool\n\nfunc init() {\n\tpool = &redigo.Pool{\n\t\tDial: func() (redigo.Conn, error) {\n\t\t\tc, err := redigo.Dial(\"tcp\", conf.RedisAddress,\n\t\t\t\tredigo.DialConnectTimeout(500*time.Millisecond),\n\t\t\t\tredigo.DialReadTimeout(500*time.Millisecond),\n\t\t\t\tredigo.DialWriteTimeout(500*time.Millisecond))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn c, nil\n\t\t},\n\t\tMaxIdle: conf.RedisConnPoolSize,\n\t}\n}\n\nfunc GetClient() redigo.Conn {\n\treturn pool.Get()\n}\n\nfunc Upsert(userId int64, userInfo string) error {\n\tc := GetClient()\n\tdefer c.Close()\n\n\t_, err := c.Do(\"SET\", conf.RedisKey_User+strconv.FormatInt(userId, 10), userInfo)\n\treturn err\n}\n\nfunc Del(userId int64) error {\n\tc := GetClient()\n\tdefer c.Close()\n\n\t_, err := c.Do(\"DEL\", conf.RedisKey_User+strconv.FormatInt(userId, 10))\n\treturn err\n}\n\nfunc IsExist(userId int64) (bool, error) {\n\tc := GetClient()\n\tdefer c.Close()\n\n\tisExist, err := redigo.Bool(c.Do(\"EXISTS\", conf.RedisKey_User+strconv.FormatInt(userId, 10)))\n\treturn isExist, err\n}\n\nfunc MGet(userIds []int64) ([]string, error) {\n\tc := GetClient()\n\tdefer c.Close()\n\n\tkeys := make([]interface{}, 0)\n\tfor _, id := range userIds {\n\t\tkeys = append(keys, conf.RedisKey_User+strconv.FormatInt(id, 10))\n\t}\n\n\tret, err := redigo.Strings(c.Do(\"MGET\", keys...))\n\treturn ret, err\n}\n"
  },
  {
    "path": "book-shop/app/user/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/app/user/infras/db\"\n\tuser \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user/userservice\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/conf\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nfunc Init() {\n\tdb.Init()\n}\n\nfunc main() {\n\tInit()\n\tr, err := etcd.NewEtcdRegistry([]string{conf.EtcdAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.UserServiceAddress)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tsvr := user.NewServer(new(UserServiceImpl),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.UserRpcServiceName}), // server name\n\t\tserver.WithServiceAddr(addr), // address\n\t\tserver.WithRegistry(r),       // registry\n\t)\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "book-shop/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\n\nif [ \"X$1\" != \"X\" ]; then\n    RUNTIME_ROOT=$1\nelse\n    RUNTIME_ROOT=${CURDIR}\nfi\n\nexport KITEX_RUNTIME_ROOT=$RUNTIME_ROOT\nexport KITEX_LOG_DIR=\"$RUNTIME_ROOT/log\"\n\nif [ ! -d \"$KITEX_LOG_DIR/app\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/app\"\nfi\n\nif [ ! -d \"$KITEX_LOG_DIR/rpc\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/rpc\"\nfi\n\nexec \"$CURDIR/bin/cwg.bookshop.user\"\n"
  },
  {
    "path": "book-shop/app/user/service/user_service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\t\"crypto/md5\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/bytedance/sonic\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/user/infras/db\"\n\t\"github.com/cloudwego/biz-demo/book-shop/app/user/infras/redis\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\t\"github.com/cloudwego/biz-demo/book-shop/pkg/errno\"\n)\n\ntype UserService struct {\n\tctx context.Context\n}\n\nfunc NewUserService(ctx context.Context) *UserService {\n\treturn &UserService{\n\t\tctx: ctx,\n\t}\n}\n\nfunc (s *UserService) CreateUser(req *user.CreateUserReq) error {\n\tusers, err := db.QueryUser(s.ctx, req.GetUserName())\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(users) != 0 {\n\t\treturn errno.UserAlreadyExistErr\n\t}\n\n\th := md5.New()\n\tif _, err = io.WriteString(h, req.Password); err != nil {\n\t\treturn err\n\t}\n\tpassWord := fmt.Sprintf(\"%x\", h.Sum(nil))\n\treturn db.CreateUser(s.ctx, []*db.User{{\n\t\tUserName: req.UserName,\n\t\tPassword: passWord,\n\t}})\n}\n\n// MGetUser using cache mode: Cache Aside\nfunc (s *UserService) MGetUser(req *user.MGetUserReq) ([]*user.User, error) {\n\tret := make([]*user.User, 0)\n\tidNotCached := make([]int64, 0)\n\n\tuserInfoStr, err := redis.MGet(req.GetIds())\n\t// 降级\n\tif err != nil || userInfoStr == nil {\n\t\tidNotCached = req.Ids\n\t} else {\n\t\tfor index, item := range userInfoStr {\n\t\t\tif item == \"\" {\n\t\t\t\tidNotCached = append(idNotCached, req.GetIds()[index])\n\t\t\t} else {\n\t\t\t\tret = append(ret, s.getDtoFromString(item))\n\t\t\t}\n\t\t}\n\t}\n\n\tusers, err := db.MGetUsers(s.ctx, idNotCached)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor _, userModel := range users {\n\t\tuserCur := &user.User{\n\t\t\tUserId:   int64(userModel.ID),\n\t\t\tUserName: userModel.UserName,\n\t\t}\n\t\tret = append(ret, userCur)\n\n\t\tstr, _ := sonic.MarshalString(userCur)\n\n\t\t_ = redis.Upsert(int64(userModel.ID), str)\n\t}\n\treturn ret, nil\n}\n\nfunc (s *UserService) CheckUser(req *user.CheckUserReq) (int64, error) {\n\th := md5.New()\n\tif _, err := io.WriteString(h, req.Password); err != nil {\n\t\treturn 0, err\n\t}\n\tpassWord := fmt.Sprintf(\"%x\", h.Sum(nil))\n\n\tuserName := req.UserName\n\tusers, err := db.QueryUser(s.ctx, userName)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif len(users) == 0 {\n\t\treturn 0, errno.UserNotExistErr\n\t}\n\tu := users[0]\n\tif u.Password != passWord {\n\t\treturn 0, errno.LoginErr\n\t}\n\treturn int64(u.ID), nil\n}\n\nfunc (s *UserService) getDtoFromString(userInfo string) *user.User {\n\tret := &user.User{}\n\t_ = sonic.UnmarshalString(userInfo, ret)\n\treturn ret\n}\n"
  },
  {
    "path": "book-shop/deploy/mysql/init.sql",
    "content": "create table `t_user`\n(\n    `id`         bigint unsigned auto_increment,\n    `created_at` datetime(3) NULL,\n    `updated_at` datetime(3) NULL,\n    `deleted_at` datetime(3) NULL,\n    `user_name`  varchar(128) NOT NULL DEFAULT '',\n    `password`   varchar(128) NOT NULL DEFAULT '',\n    PRIMARY KEY (`id`),\n    KEY        `idx_username` (`user_name`) COMMENT 'username index'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='user account table';\n\ncreate table `t_product`\n(\n    `id`          bigint unsigned auto_increment,\n    `created_at`  datetime(3) NULL,\n    `updated_at`  datetime(3) NULL,\n    `deleted_at`  datetime(3) NULL,\n    `product_id`  bigint(20) NOT NULL,\n    `name`        varchar(255) NOT NULL DEFAULT '',\n    `pic`         varchar(255) NOT NULL DEFAULT '',\n    `description` text NULL,\n    `isbn`        varchar(255) NOT NULL DEFAULT '',\n    `spu_name`    varchar(255) NOT NULL DEFAULT '',\n    `spu_price`   int(11) NOT NULL DEFAULT '0',\n    `price`       int(11) NOT NULL DEFAULT '0',\n    `stock`       int(11) NOT NULL DEFAULT '0',\n    `status`      tinyint(4) NOT NULL DEFAULT '0',\n    PRIMARY KEY (`id`),\n    KEY         `idx_product_id` (`product_id`) COMMENT 'product_id index'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='product table';\n\ncreate table `t_order`\n(\n    `id`               bigint unsigned auto_increment,\n    `created_at`       datetime(3) NULL,\n    `updated_at`       datetime(3) NULL,\n    `deleted_at`       datetime(3) NULL,\n    `order_id`         bigint(20) NOT NULL,\n    `user_id`          bigint NOT NULL,\n    `address`          text NULL,\n    `product_id`       bigint(20) NOT NULL,\n    `stock_num`        int(11) NOT NULL DEFAULT '0',\n    `product_snapshot` longtext NULL,\n    `status`           tinyint(4) NOT NULL DEFAULT '0',\n    PRIMARY KEY (`id`),\n    KEY              `idx_order_id` (`order_id`) COMMENT 'order_id index'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='order table';\n"
  },
  {
    "path": "book-shop/deploy/redis/redis.conf",
    "content": "# Copyright 2021 CloudWeGo Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\nbind 0.0.0.0\nprotected-mode no\nport 6379\ntcp-backlog 511\ndaemonize no\nsupervised no\npidfile /var/run/redis_6379.pid\nloglevel notice\nlogfile \"\"\ndatabases 16\nalways-show-logo yes\nsave 900 1\nsave 300 10\nsave 60 10000\nstop-writes-on-bgsave-error yes\nrdbcompression yes\nrdbchecksum yes\ndbfilename dump.rdb\nreplica-serve-stale-data yes\nrepl-diskless-sync no\nrepl-diskless-sync-delay 5\nrepl-diskless-load disabled\nrepl-disable-tcp-nodelay no\nreplica-priority 100\nacllog-max-len 128\nlazyfree-lazy-eviction no\nlazyfree-lazy-expire no\nlazyfree-lazy-server-del no\nreplica-lazy-flush no\nlazyfree-lazy-user-del no\noom-score-adj no\noom-score-adj-values 0 200 800\nappendonly no\nappendfilename \"appendonly.aof\"\nappendfsync everysec\nno-appendfsync-on-rewrite no\nauto-aof-rewrite-percentage 100\nauto-aof-rewrite-min-size 64mb\naof-load-truncated yes\naof-use-rdb-preamble yes\nlua-time-limit 5000\nslowlog-log-slower-than 10000\nslowlog-max-len 128\nlatency-monitor-threshold 0\nnotify-keyspace-events \"\"\nhash-max-ziplist-entries 512\nhash-max-ziplist-value 64\nlist-max-ziplist-size -2\nlist-compress-depth 0\nset-max-intset-entries 512\nzset-max-ziplist-entries 128\nzset-max-ziplist-value 64\nhll-sparse-max-bytes 3000\nstream-node-max-bytes 4096\nstream-node-max-entries 100\nactiverehashing yes\nclient-output-buffer-limit normal 0 0 0\nclient-output-buffer-limit replica 256mb 64mb 60\nclient-output-buffer-limit pubsub 32mb 8mb 60\nhz 10\ndynamic-hz yes\naof-rewrite-incremental-fsync yes\nrdb-save-incremental-fsync yes\njemalloc-bg-thread yes"
  },
  {
    "path": "book-shop/docker-compose.yml",
    "content": "# Copyright 2021 CloudWeGo Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\nversion: '3.7'\n\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - \"3306:3306\"\n    volumes:\n      - ./deploy/mysql:/docker-entrypoint-initdb.d\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  Etcd:\n    image: 'bitnami/etcd:latest'\n    environment:\n      - ALLOW_NONE_AUTHENTICATION=yes\n    ports:\n      - \"2379:2379\"\n  elasticsearch:\n    image: elasticsearch:7.6.2\n    environment:\n      - \"cluster.name=elasticsearch\" #设置集群名称为elasticsearch\n      - \"discovery.type=single-node\" #以单一节点模式启动\n      - \"ES_JAVA_OPTS=-Xms512m -Xmx512m\" #设置使用jvm内存大小\n    ports:\n      - \"9200:9200\"\n      - \"9300:9300\"\n  kibana:\n    image: kibana:7.6.2\n    links:\n      - elasticsearch:es #可以用es这个域名访问elasticsearch服务\n    depends_on:\n      - elasticsearch #kibana在elasticsearch启动之后再启动\n    environment:\n      - \"elasticsearch.hosts=http://es:9200\" #设置访问elasticsearch的地址\n    ports:\n      - \"5601:5601\"\n  redis:\n    image: redis:latest\n    restart: always\n    container_name: redis\n    ports:\n      - \"6379:6379\"\n    volumes:\n      - ./deploy/redis/redis.conf:/etc/redis/redis.conf\n    command: redis-server /etc/redis/redis.conf\n    privileged: true"
  },
  {
    "path": "book-shop/docs/docs.go",
    "content": "// Package docs GENERATED BY SWAG; DO NOT EDIT\n// This file was generated by swaggo/swag\npackage docs\n\nimport \"github.com/swaggo/swag\"\n\nconst docTemplate = `{\n    \"schemes\": {{ marshal .Schemes }},\n    \"swagger\": \"2.0\",\n    \"info\": {\n        \"description\": \"{{escape .Description}}\",\n        \"title\": \"{{.Title}}\",\n        \"contact\": {\n            \"name\": \"CloudWeGo\",\n            \"url\": \"https://github.com/cloudwego\",\n            \"email\": \"conduct@cloudwego.io\"\n        },\n        \"license\": {\n            \"name\": \"Apache 2.0\",\n            \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n        },\n        \"version\": \"{{.Version}}\"\n    },\n    \"host\": \"{{.Host}}\",\n    \"basePath\": \"{{.BasePath}}\",\n    \"paths\": {\n        \"/item2b/add\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"add product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"add product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of adding product\",\n                        \"name\": \"addProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.AddProductRequest\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/del\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"delete product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"delete product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of operating product\",\n                        \"name\": \"delProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.OperateProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/edit\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"edit product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"edit product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of editing product\",\n                        \"name\": \"editProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.EditProductRequest\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/get\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"get product by product_id\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"get product by product_id\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"product_id\",\n                        \"name\": \"product_id\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/list\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"get product list\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"get product list\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of listing products\",\n                        \"name\": \"listProductReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.ListProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/offline\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"offline product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"offline product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of operating product\",\n                        \"name\": \"offlineProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.OperateProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/online\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"online product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"online product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of operating product\",\n                        \"name\": \"onlineProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.OperateProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2c/mget\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"batch get products by product_id (2C interface)\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module(2C)\"\n                ],\n                \"summary\": \"batch get products by product_id (2C interface)\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"product-ids separated by commas\",\n                        \"name\": \"product_ids\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2c/search\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"search products (2C interface)\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module(2C)\"\n                ],\n                \"summary\": \"search products (2C interface)\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of searching products\",\n                        \"name\": \"searchProductReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.SearchProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/order/cancel\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"consumer cancels order\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"order module\"\n                ],\n                \"summary\": \"consumer cancels order\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param to cancel one order\",\n                        \"name\": \"cancelOrderReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.CancelOrderReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/order/create\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"consumer creates order\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"order module\"\n                ],\n                \"summary\": \"consumer creates order\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param to create one order\",\n                        \"name\": \"createOrderReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.CreateOrderReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/order/get\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"get order by order_id\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"order module\"\n                ],\n                \"summary\": \"get order by order_id\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"order id\",\n                        \"name\": \"order_id\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/order/list\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"get order list of a consumer\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"order module\"\n                ],\n                \"summary\": \"get order list of a consumer\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param to get order list\",\n                        \"name\": \"listOrderReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.ListOrderReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/shop/login\": {\n            \"post\": {\n                \"description\": \"shop login\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"shop module\"\n                ],\n                \"summary\": \"shop login\",\n                \"parameters\": [\n                    {\n                        \"description\": \"login param\",\n                        \"name\": \"userParam\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.UserParam\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.LoginResponse\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/user/login\": {\n            \"post\": {\n                \"description\": \"user login\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"user module\"\n                ],\n                \"summary\": \"user login\",\n                \"parameters\": [\n                    {\n                        \"description\": \"login param\",\n                        \"name\": \"userParam\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.UserParam\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.LoginResponse\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/user/register\": {\n            \"post\": {\n                \"description\": \"user register\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"user module\"\n                ],\n                \"summary\": \"user register\",\n                \"parameters\": [\n                    {\n                        \"description\": \"register param\",\n                        \"name\": \"userParam\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.UserParam\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        }\n    },\n    \"definitions\": {\n        \"model.AddProductRequest\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"description\": {\n                    \"type\": \"string\"\n                },\n                \"isbn\": {\n                    \"type\": \"string\"\n                },\n                \"name\": {\n                    \"type\": \"string\"\n                },\n                \"pic\": {\n                    \"type\": \"string\"\n                },\n                \"price\": {\n                    \"type\": \"integer\"\n                },\n                \"spu_name\": {\n                    \"type\": \"string\"\n                },\n                \"spu_price\": {\n                    \"type\": \"integer\"\n                },\n                \"stock\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.CancelOrderReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"order_id\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.CreateOrderReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"address\": {\n                    \"type\": \"string\"\n                },\n                \"product_id\": {\n                    \"type\": \"string\"\n                },\n                \"stock_num\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.EditProductRequest\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"description\": {\n                    \"type\": \"string\"\n                },\n                \"isbn\": {\n                    \"type\": \"string\"\n                },\n                \"name\": {\n                    \"type\": \"string\"\n                },\n                \"pic\": {\n                    \"type\": \"string\"\n                },\n                \"price\": {\n                    \"type\": \"integer\"\n                },\n                \"product_id\": {\n                    \"type\": \"string\"\n                },\n                \"spu_name\": {\n                    \"type\": \"string\"\n                },\n                \"spu_price\": {\n                    \"type\": \"integer\"\n                },\n                \"stock\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.ListOrderReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"status\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.ListProductReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\"\n                },\n                \"spu_name\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.LoginResponse\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"code\": {\n                    \"type\": \"integer\"\n                },\n                \"expire\": {\n                    \"type\": \"string\"\n                },\n                \"token\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.OperateProductReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"product_id\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.Response\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"code\": {\n                    \"type\": \"integer\"\n                },\n                \"data\": {},\n                \"message\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.SearchProductReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"description\": {\n                    \"type\": \"string\"\n                },\n                \"name\": {\n                    \"type\": \"string\"\n                },\n                \"spu_name\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.UserParam\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"password\": {\n                    \"type\": \"string\"\n                },\n                \"username\": {\n                    \"type\": \"string\"\n                }\n            }\n        }\n    },\n    \"securityDefinitions\": {\n        \"TokenAuth\": {\n            \"type\": \"apiKey\",\n            \"name\": \"Authorization\",\n            \"in\": \"header\"\n        }\n    }\n}`\n\n// SwaggerInfo holds exported Swagger Info so clients can modify it\nvar SwaggerInfo = &swag.Spec{\n\tVersion:          \"1.0\",\n\tHost:             \"localhost:8080\",\n\tBasePath:         \"/\",\n\tSchemes:          []string{\"http\"},\n\tTitle:            \"Book-Shop\",\n\tDescription:      \"This is a book-shop demo using Hertz and KiteX.\",\n\tInfoInstanceName: \"swagger\",\n\tSwaggerTemplate:  docTemplate,\n}\n\nfunc init() {\n\tswag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)\n}\n"
  },
  {
    "path": "book-shop/docs/swagger.json",
    "content": "{\n    \"schemes\": [\n        \"http\"\n    ],\n    \"swagger\": \"2.0\",\n    \"info\": {\n        \"description\": \"This is a book-shop demo using Hertz and KiteX.\",\n        \"title\": \"Book-Shop\",\n        \"contact\": {\n            \"name\": \"CloudWeGo\",\n            \"url\": \"https://github.com/cloudwego\",\n            \"email\": \"conduct@cloudwego.io\"\n        },\n        \"license\": {\n            \"name\": \"Apache 2.0\",\n            \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n        },\n        \"version\": \"1.0\"\n    },\n    \"host\": \"localhost:8080\",\n    \"basePath\": \"/\",\n    \"paths\": {\n        \"/item2b/add\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"add product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"add product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of adding product\",\n                        \"name\": \"addProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.AddProductRequest\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/del\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"delete product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"delete product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of operating product\",\n                        \"name\": \"delProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.OperateProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/edit\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"edit product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"edit product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of editing product\",\n                        \"name\": \"editProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.EditProductRequest\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/get\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"get product by product_id\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"get product by product_id\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"product_id\",\n                        \"name\": \"product_id\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/list\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"get product list\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"get product list\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of listing products\",\n                        \"name\": \"listProductReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.ListProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/offline\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"offline product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"offline product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of operating product\",\n                        \"name\": \"offlineProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.OperateProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2b/online\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"online product\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module\"\n                ],\n                \"summary\": \"online product\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of operating product\",\n                        \"name\": \"onlineProductRequest\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.OperateProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2c/mget\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"batch get products by product_id (2C interface)\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module(2C)\"\n                ],\n                \"summary\": \"batch get products by product_id (2C interface)\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"product-ids separated by commas\",\n                        \"name\": \"product_ids\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/item2c/search\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"search products (2C interface)\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"product module(2C)\"\n                ],\n                \"summary\": \"search products (2C interface)\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param of searching products\",\n                        \"name\": \"searchProductReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.SearchProductReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/order/cancel\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"consumer cancels order\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"order module\"\n                ],\n                \"summary\": \"consumer cancels order\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param to cancel one order\",\n                        \"name\": \"cancelOrderReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.CancelOrderReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/order/create\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"consumer creates order\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"order module\"\n                ],\n                \"summary\": \"consumer creates order\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param to create one order\",\n                        \"name\": \"createOrderReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.CreateOrderReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/order/get\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"get order by order_id\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"order module\"\n                ],\n                \"summary\": \"get order by order_id\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"order id\",\n                        \"name\": \"order_id\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/order/list\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"TokenAuth\": []\n                    }\n                ],\n                \"description\": \"get order list of a consumer\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"order module\"\n                ],\n                \"summary\": \"get order list of a consumer\",\n                \"parameters\": [\n                    {\n                        \"description\": \"request param to get order list\",\n                        \"name\": \"listOrderReq\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.ListOrderReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/shop/login\": {\n            \"post\": {\n                \"description\": \"shop login\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"shop module\"\n                ],\n                \"summary\": \"shop login\",\n                \"parameters\": [\n                    {\n                        \"description\": \"login param\",\n                        \"name\": \"userParam\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.UserParam\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.LoginResponse\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/user/login\": {\n            \"post\": {\n                \"description\": \"user login\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"user module\"\n                ],\n                \"summary\": \"user login\",\n                \"parameters\": [\n                    {\n                        \"description\": \"login param\",\n                        \"name\": \"userParam\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.UserParam\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.LoginResponse\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/user/register\": {\n            \"post\": {\n                \"description\": \"user register\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"produces\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"user module\"\n                ],\n                \"summary\": \"user register\",\n                \"parameters\": [\n                    {\n                        \"description\": \"register param\",\n                        \"name\": \"userParam\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.UserParam\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"OK\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/model.Response\"\n                        }\n                    }\n                }\n            }\n        }\n    },\n    \"definitions\": {\n        \"model.AddProductRequest\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"description\": {\n                    \"type\": \"string\"\n                },\n                \"isbn\": {\n                    \"type\": \"string\"\n                },\n                \"name\": {\n                    \"type\": \"string\"\n                },\n                \"pic\": {\n                    \"type\": \"string\"\n                },\n                \"price\": {\n                    \"type\": \"integer\"\n                },\n                \"spu_name\": {\n                    \"type\": \"string\"\n                },\n                \"spu_price\": {\n                    \"type\": \"integer\"\n                },\n                \"stock\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.CancelOrderReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"order_id\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.CreateOrderReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"address\": {\n                    \"type\": \"string\"\n                },\n                \"product_id\": {\n                    \"type\": \"string\"\n                },\n                \"stock_num\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.EditProductRequest\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"description\": {\n                    \"type\": \"string\"\n                },\n                \"isbn\": {\n                    \"type\": \"string\"\n                },\n                \"name\": {\n                    \"type\": \"string\"\n                },\n                \"pic\": {\n                    \"type\": \"string\"\n                },\n                \"price\": {\n                    \"type\": \"integer\"\n                },\n                \"product_id\": {\n                    \"type\": \"string\"\n                },\n                \"spu_name\": {\n                    \"type\": \"string\"\n                },\n                \"spu_price\": {\n                    \"type\": \"integer\"\n                },\n                \"stock\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.ListOrderReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"status\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.ListProductReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\"\n                },\n                \"spu_name\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"model.LoginResponse\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"code\": {\n                    \"type\": \"integer\"\n                },\n                \"expire\": {\n                    \"type\": \"string\"\n                },\n                \"token\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.OperateProductReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"product_id\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.Response\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"code\": {\n                    \"type\": \"integer\"\n                },\n                \"data\": {},\n                \"message\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.SearchProductReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"description\": {\n                    \"type\": \"string\"\n                },\n                \"name\": {\n                    \"type\": \"string\"\n                },\n                \"spu_name\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"model.UserParam\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"password\": {\n                    \"type\": \"string\"\n                },\n                \"username\": {\n                    \"type\": \"string\"\n                }\n            }\n        }\n    },\n    \"securityDefinitions\": {\n        \"TokenAuth\": {\n            \"type\": \"apiKey\",\n            \"name\": \"Authorization\",\n            \"in\": \"header\"\n        }\n    }\n}"
  },
  {
    "path": "book-shop/docs/swagger.yaml",
    "content": "basePath: /\ndefinitions:\n  model.AddProductRequest:\n    properties:\n      description:\n        type: string\n      isbn:\n        type: string\n      name:\n        type: string\n      pic:\n        type: string\n      price:\n        type: integer\n      spu_name:\n        type: string\n      spu_price:\n        type: integer\n      stock:\n        type: integer\n    type: object\n  model.CancelOrderReq:\n    properties:\n      order_id:\n        type: string\n    type: object\n  model.CreateOrderReq:\n    properties:\n      address:\n        type: string\n      product_id:\n        type: string\n      stock_num:\n        type: integer\n    type: object\n  model.EditProductRequest:\n    properties:\n      description:\n        type: string\n      isbn:\n        type: string\n      name:\n        type: string\n      pic:\n        type: string\n      price:\n        type: integer\n      product_id:\n        type: string\n      spu_name:\n        type: string\n      spu_price:\n        type: integer\n      stock:\n        type: integer\n    type: object\n  model.ListOrderReq:\n    properties:\n      status:\n        type: integer\n    type: object\n  model.ListProductReq:\n    properties:\n      name:\n        type: string\n      spu_name:\n        type: string\n      status:\n        type: integer\n    type: object\n  model.LoginResponse:\n    properties:\n      code:\n        type: integer\n      expire:\n        type: string\n      token:\n        type: string\n    type: object\n  model.OperateProductReq:\n    properties:\n      product_id:\n        type: string\n    type: object\n  model.Response:\n    properties:\n      code:\n        type: integer\n      data: {}\n      message:\n        type: string\n    type: object\n  model.SearchProductReq:\n    properties:\n      description:\n        type: string\n      name:\n        type: string\n      spu_name:\n        type: string\n    type: object\n  model.UserParam:\n    properties:\n      password:\n        type: string\n      username:\n        type: string\n    type: object\nhost: localhost:8080\ninfo:\n  contact:\n    email: conduct@cloudwego.io\n    name: CloudWeGo\n    url: https://github.com/cloudwego\n  description: This is a book-shop demo using Hertz and KiteX.\n  license:\n    name: Apache 2.0\n    url: http://www.apache.org/licenses/LICENSE-2.0.html\n  title: Book-Shop\n  version: \"1.0\"\npaths:\n  /item2b/add:\n    post:\n      consumes:\n      - application/json\n      description: add product\n      parameters:\n      - description: request param of adding product\n        in: body\n        name: addProductRequest\n        required: true\n        schema:\n          $ref: '#/definitions/model.AddProductRequest'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: add product\n      tags:\n      - product module\n  /item2b/del:\n    post:\n      consumes:\n      - application/json\n      description: delete product\n      parameters:\n      - description: request param of operating product\n        in: body\n        name: delProductRequest\n        required: true\n        schema:\n          $ref: '#/definitions/model.OperateProductReq'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: delete product\n      tags:\n      - product module\n  /item2b/edit:\n    post:\n      consumes:\n      - application/json\n      description: edit product\n      parameters:\n      - description: request param of editing product\n        in: body\n        name: editProductRequest\n        required: true\n        schema:\n          $ref: '#/definitions/model.EditProductRequest'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: edit product\n      tags:\n      - product module\n  /item2b/get:\n    get:\n      consumes:\n      - application/json\n      description: get product by product_id\n      parameters:\n      - description: product_id\n        in: query\n        name: product_id\n        required: true\n        type: integer\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: get product by product_id\n      tags:\n      - product module\n  /item2b/list:\n    post:\n      consumes:\n      - application/json\n      description: get product list\n      parameters:\n      - description: request param of listing products\n        in: body\n        name: listProductReq\n        required: true\n        schema:\n          $ref: '#/definitions/model.ListProductReq'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: get product list\n      tags:\n      - product module\n  /item2b/offline:\n    post:\n      consumes:\n      - application/json\n      description: offline product\n      parameters:\n      - description: request param of operating product\n        in: body\n        name: offlineProductRequest\n        required: true\n        schema:\n          $ref: '#/definitions/model.OperateProductReq'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: offline product\n      tags:\n      - product module\n  /item2b/online:\n    post:\n      consumes:\n      - application/json\n      description: online product\n      parameters:\n      - description: request param of operating product\n        in: body\n        name: onlineProductRequest\n        required: true\n        schema:\n          $ref: '#/definitions/model.OperateProductReq'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: online product\n      tags:\n      - product module\n  /item2c/mget:\n    get:\n      consumes:\n      - application/json\n      description: batch get products by product_id (2C interface)\n      parameters:\n      - description: product-ids separated by commas\n        in: query\n        name: product_ids\n        required: true\n        type: string\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: batch get products by product_id (2C interface)\n      tags:\n      - product module(2C)\n  /item2c/search:\n    post:\n      consumes:\n      - application/json\n      description: search products (2C interface)\n      parameters:\n      - description: request param of searching products\n        in: body\n        name: searchProductReq\n        required: true\n        schema:\n          $ref: '#/definitions/model.SearchProductReq'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: search products (2C interface)\n      tags:\n      - product module(2C)\n  /order/cancel:\n    post:\n      consumes:\n      - application/json\n      description: consumer cancels order\n      parameters:\n      - description: request param to cancel one order\n        in: body\n        name: cancelOrderReq\n        required: true\n        schema:\n          $ref: '#/definitions/model.CancelOrderReq'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: consumer cancels order\n      tags:\n      - order module\n  /order/create:\n    post:\n      consumes:\n      - application/json\n      description: consumer creates order\n      parameters:\n      - description: request param to create one order\n        in: body\n        name: createOrderReq\n        required: true\n        schema:\n          $ref: '#/definitions/model.CreateOrderReq'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: consumer creates order\n      tags:\n      - order module\n  /order/get:\n    get:\n      consumes:\n      - application/json\n      description: get order by order_id\n      parameters:\n      - description: order id\n        in: query\n        name: order_id\n        required: true\n        type: integer\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: get order by order_id\n      tags:\n      - order module\n  /order/list:\n    post:\n      consumes:\n      - application/json\n      description: get order list of a consumer\n      parameters:\n      - description: request param to get order list\n        in: body\n        name: listOrderReq\n        required: true\n        schema:\n          $ref: '#/definitions/model.ListOrderReq'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      security:\n      - TokenAuth: []\n      summary: get order list of a consumer\n      tags:\n      - order module\n  /shop/login:\n    post:\n      consumes:\n      - application/json\n      description: shop login\n      parameters:\n      - description: login param\n        in: body\n        name: userParam\n        required: true\n        schema:\n          $ref: '#/definitions/model.UserParam'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.LoginResponse'\n      summary: shop login\n      tags:\n      - shop module\n  /user/login:\n    post:\n      consumes:\n      - application/json\n      description: user login\n      parameters:\n      - description: login param\n        in: body\n        name: userParam\n        required: true\n        schema:\n          $ref: '#/definitions/model.UserParam'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.LoginResponse'\n      summary: user login\n      tags:\n      - user module\n  /user/register:\n    post:\n      consumes:\n      - application/json\n      description: user register\n      parameters:\n      - description: register param\n        in: body\n        name: userParam\n        required: true\n        schema:\n          $ref: '#/definitions/model.UserParam'\n      produces:\n      - application/json\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: '#/definitions/model.Response'\n      summary: user register\n      tags:\n      - user module\nschemes:\n- http\nsecurityDefinitions:\n  TokenAuth:\n    in: header\n    name: Authorization\n    type: apiKey\nswagger: \"2.0\"\n"
  },
  {
    "path": "book-shop/go.mod",
    "content": "module github.com/cloudwego/biz-demo/book-shop\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.16.0\n\tgithub.com/bwmarrin/snowflake v0.3.0\n\tgithub.com/bytedance/sonic v1.13.2\n\tgithub.com/cloudwego/hertz v0.9.6\n\tgithub.com/cloudwego/kitex v0.12.3\n\tgithub.com/cloudwego/kitex/pkg/protocol/bthrift v0.0.0-20241219022956-e15b7a1a61d2\n\tgithub.com/gomodule/redigo v1.8.9\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/jwt v1.0.3\n\tgithub.com/hertz-contrib/pprof v0.1.2\n\tgithub.com/hertz-contrib/swagger v0.1.0\n\tgithub.com/jinzhu/copier v0.3.5\n\tgithub.com/kitex-contrib/registry-etcd v0.2.6\n\tgithub.com/olivere/elastic/v7 v7.0.32\n\tgithub.com/r3labs/diff/v2 v2.15.1\n\tgithub.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a\n\tgithub.com/swaggo/swag v1.16.1\n\tgorm.io/driver/mysql v1.4.4\n\tgorm.io/gorm v1.24.2\n)\n\nrequire (\n\tgithub.com/KyleBanks/depth v1.2.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.5.2 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.3 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.4 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.5 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.18 // indirect\n\tgithub.com/coreos/go-semver v0.3.0 // indirect\n\tgithub.com/coreos/go-systemd/v22 v22.3.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.20.0 // indirect\n\tgithub.com/go-openapi/jsonreference v0.20.2 // indirect\n\tgithub.com/go-openapi/spec v0.20.9 // indirect\n\tgithub.com/go-openapi/swag v0.22.4 // indirect\n\tgithub.com/go-sql-driver/mysql v1.6.0 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang-jwt/jwt/v4 v4.5.2 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.18.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/vmihailenco/msgpack v4.0.4+incompatible // indirect\n\tgo.etcd.io/etcd/api/v3 v3.5.12 // indirect\n\tgo.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect\n\tgo.etcd.io/etcd/client/v3 v3.5.12 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgolang.org/x/tools v0.34.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "book-shop/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=\ngithub.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=\ngithub.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.12 h1:aeszOmGw8CPX8CRx1DZ/Glzb1yXvhjDh6jdFBNZjsU4=\ngithub.com/bytedance/mockey v1.2.12/go.mod h1:3ZA4MQasmqC87Tw0w7Ygdy7eHIc2xgpZ8Pona5rsYIk=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ=\ngithub.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.5.2 h1:hw4AUvaQP49TOI6hqIhyDd4N1nbaKTH3vOOgiaEftyU=\ngithub.com/cloudwego/dynamicgo v0.5.2/go.mod h1:DknfxjIMuGvXow409bS/AWycXONdc02HECBL0qpNqTY=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.3 h1:t1hhhAi8lXcx7Ncs4PR1pSZ90vlDU1cy5K2btDMFpoA=\ngithub.com/cloudwego/frugal v0.2.3/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4 h1:EoQiCG4sTonTPHxOGE0VlQs+sQR+Hsi2uN0qqwu8O50=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.9.6 h1:Kj5SSPlKBC32NIN7+B/tt8O1pdDz8brMai00rqqjULQ=\ngithub.com/cloudwego/hertz v0.9.6/go.mod h1:X5Ez52XhtszU4t+CTBGIJI4PqmcI1oSf8ULBz0SWfLo=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.12.3 h1:vE2KR2HUTBFO4OxNCc3qzCBm31V0nuLDeXD+TaID2f4=\ngithub.com/cloudwego/kitex v0.12.3/go.mod h1:QfaRmedtGrbc9C0ADEa6UDeJgALiq5DfnCQaO4mQYbk=\ngithub.com/cloudwego/kitex/pkg/protocol/bthrift v0.0.0-20241219022956-e15b7a1a61d2 h1:jU6gpAkJ3HZLZeSpxrL1xaCd/auvAbLs0SN/ylXn9TA=\ngithub.com/cloudwego/kitex/pkg/protocol/bthrift v0.0.0-20241219022956-e15b7a1a61d2/go.mod h1:OP63V8YwwSlPVFqHZblV3mJXLPIjcIdwkT6ZYjEggcI=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.5 h1:6E/BWhSzQoyLg9Kx/4xiMdIIpovzwBtXvuqSqaTUzDQ=\ngithub.com/cloudwego/netpoll v0.6.5/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.3.18 h1:gnr1vz7G3RbwwCK9AMKHZf63VYGa7ene6WbI9VrBJSw=\ngithub.com/cloudwego/thriftgo v0.3.18/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\ngithub.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=\ngithub.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=\ngithub.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ=\ngithub.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA=\ngithub.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=\ngithub.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=\ngithub.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=\ngithub.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8=\ngithub.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=\ngithub.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU=\ngithub.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=\ngithub.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=\ngithub.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=\ngithub.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/jwt v1.0.3 h1:JScJd9/Y7KhtlCwo79P/lqQ7ADbiBsNAB5NnPU2LV4U=\ngithub.com/hertz-contrib/jwt v1.0.3/go.mod h1:4+zce6F3XZgrwniwPFBvLSEmIIZhyHXqHscJ1Bt89r4=\ngithub.com/hertz-contrib/pprof v0.1.2 h1:eC4jpg8ToSi+9YEOPIr3jki8e/ix3aFPtphCgJ36T6Q=\ngithub.com/hertz-contrib/pprof v0.1.2/go.mod h1:OKXw5wCUcy1OVwgQLsoCS9JzfcdjoofP+7Uk4c7P9Po=\ngithub.com/hertz-contrib/swagger v0.1.0 h1:FlnMPRHuvAt/3pt3KCQRZ6RH1g/agma9SU70Op2Pb58=\ngithub.com/hertz-contrib/swagger v0.1.0/go.mod h1:Bt5i+Nyo7bGmYbuEfMArx7raf1oK+nWVgYbEvhpICKE=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=\ngithub.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=\ngithub.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-etcd v0.2.6 h1:q+X8UmZQX+00g1IpGP4g4i20WYbEgcSN38EX60pZu0Y=\ngithub.com/kitex-contrib/registry-etcd v0.2.6/go.mod h1:jJ1n+obYqhifEBH5hWXo2w7dN1LDstWt7CNJTuhtcoo=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E=\ngithub.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/r3labs/diff/v2 v2.15.1 h1:EOrVqPUzi+njlumoqJwiS/TgGgmZo83619FNDB9xQUg=\ngithub.com/r3labs/diff/v2 v2.15.1/go.mod h1:I8noH9Fc2fjSaMxqF3G2lhDdC0b+JXCfyx85tWFM9kc=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=\ngithub.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/assertions v1.1.1 h1:T/YLemO5Yp7KPzS+lVtu+WsHn8yoSwTfItdAd1r3cck=\ngithub.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=\ngithub.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a h1:kAe4YSu0O0UFn1DowNo2MY5p6xzqtJ/wQ7LZynSvGaY=\ngithub.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=\ngithub.com/swaggo/swag v1.16.1 h1:fTNRhKstPKxcnoKsytm4sahr8FaYzUcT7i1/3nd/fBg=\ngithub.com/swaggo/swag v1.16.1/go.mod h1:9/LMvHycG3NFHfR6LwvikHv5iFvmPADQ359cKikGxto=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=\ngithub.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=\ngithub.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA=\ngo.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=\ngo.etcd.io/etcd/api/v3 v3.5.12 h1:W4sw5ZoU2Juc9gBWuLk5U6fHfNVyY1WC5g9uiXZio/c=\ngo.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarindU2A=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4=\ngo.etcd.io/etcd/client/v2 v2.305.12 h1:0m4ovXYo1CHaA/Mp3X/Fak5sRNIWf01wk/X1/G3sGKI=\ngo.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E=\ngo.etcd.io/etcd/client/v3 v3.5.12 h1:v5lCPXn1pf1Uu3M4laUE2hp/geOTc5uPcYYsNe1lDxg=\ngo.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw=\ngo.etcd.io/etcd/pkg/v3 v3.5.12 h1:OK2fZKI5hX/+BTK76gXSTyZMrbnARyX9S643GenNGb8=\ngo.etcd.io/etcd/pkg/v3 v3.5.12/go.mod h1:UVwg/QIMoJncyeb/YxvJBJCE/NEwtHWashqc8A1nj/M=\ngo.etcd.io/etcd/raft/v3 v3.5.12 h1:7r22RufdDsq2z3STjoR7Msz6fYH8tmbkdheGfwJNRmU=\ngo.etcd.io/etcd/raft/v3 v3.5.12/go.mod h1:ERQuZVe79PI6vcC3DlKBukDCLja/L7YMu29B74Iwj4U=\ngo.etcd.io/etcd/server/v3 v3.5.12 h1:EtMjsbfyfkwZuA2JlKOiBfuGkFCekv5H178qjXypbG8=\ngo.etcd.io/etcd/server/v3 v3.5.12/go.mod h1:axB0oCjMy+cemo5290/CutIjoxlfA6KVYKD1w0uue10=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0 h1:PzIubN4/sjByhDRHLviCjJuweBXWFZWhghjg7cS28+M=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0/go.mod h1:Ct6zzQEuGK3WpJs2n4dn+wfJYzd/+hNnxMRTWjGn30M=\ngo.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc=\ngo.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0=\ngo.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA=\ngo.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM=\ngo.opentelemetry.io/otel/sdk v1.20.0 h1:5Jf6imeFZlZtKv9Qbo6qt2ZkmWtdWx/wzcCbNUlAWGM=\ngo.opentelemetry.io/otel/sdk v1.20.0/go.mod h1:rmkSx1cZCm/tn16iWDn1GQbLtsW/LvsdEEFzCSRM6V0=\ngo.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ=\ngo.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=\ngolang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=\ngolang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8=\ngoogle.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.4.4 h1:MX0K9Qvy0Na4o7qSC/YI7XxqUw5KDw01umqgID+svdQ=\ngorm.io/driver/mysql v1.4.4/go.mod h1:BCg8cKI+R0j/rZRQxeKis/forqRwRSYOR8OM3Wo6hOM=\ngorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=\ngorm.io/gorm v1.24.2 h1:9wR6CFD+G8nOusLdvkZelOEhpJVwwHzpQOUM+REd6U0=\ngorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "book-shop/idl/base.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\nnamespace go base\n\nstruct BaseResp {\n    1: string StatusMessage = \"\"\n    2: i32 StatusCode = 0\n    3: optional map<string, string> Extra\n}"
  },
  {
    "path": "book-shop/idl/item.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\ninclude \"base.thrift\"\nnamespace go cwg.bookshop.item\n\nenum Status {\n    Online // 上架\n    Offline // 下架\n    Delete // 删除\n}\n\nstruct BookProperty {\n    1: string isbn // ISBN\n    2: string spu_name // 书名\n    3: i64 spu_price // 定价\n}\n\nstruct Product {\n    1: i64 product_id\n    2: string name // 商品名\n    3: string pic // 主图\n    4: string description // 详情\n    5: BookProperty property // 属性\n    6: i64 price // 价格\n    7: i64 stock // 库存\n    8: Status status // 商品状态\n}\n\nstruct AddReq {\n    1: required string name // 商品名\n    2: required string pic // 主图\n    3: required string description // 详情\n    4: required BookProperty property // 属性\n    5: required i64 price // 价格\n    6: required i64 stock // 库存\n}\n\nstruct AddResp {\n    1: i64 product_id\n    255: base.BaseResp BaseResp\n}\n\nstruct EditReq {\n    1: required i64 product_id\n    2: optional string name // 商品名\n    3: optional string pic // 主图\n    4: optional string description // 详情\n    5: optional BookProperty property // 属性\n    6: optional i64 price // 价格\n    7: optional i64 stock // 库存\n}\n\nstruct EditResp {\n    255: base.BaseResp BaseResp\n}\n\nstruct DeleteReq {\n    1: required i64 product_id\n}\n\nstruct DeleteResp {\n    255: base.BaseResp BaseResp\n}\n\nstruct OnlineReq {\n    1: required i64 product_id\n}\n\nstruct OnlineResp {\n    255: base.BaseResp BaseResp\n}\n\nstruct OfflineReq {\n    1: required i64 product_id\n}\n\nstruct OfflineResp {\n    255: base.BaseResp BaseResp\n}\n\nstruct GetReq {\n    1: required i64 product_id\n}\n\nstruct GetResp {\n    1: Product product\n    255: base.BaseResp BaseResp\n}\n\nstruct MGet2CReq {\n    1: required list<i64> product_ids\n}\n\nstruct MGet2CResp {\n    1: map<i64, Product> product_map\n    255: base.BaseResp BaseResp\n}\n\nstruct SearchReq {\n    1: optional string name\n    2: optional string description\n    3: optional string spu_name\n}\n\nstruct SearchResp {\n    1: list<Product> products\n    255: base.BaseResp BaseResp\n}\n\nstruct ListReq {\n    1: optional string name\n    2: optional string spu_name\n    3: optional Status status\n}\n\nstruct ListResp {\n    1: list<Product> products\n    255: base.BaseResp BaseResp\n}\n\nstruct DecrStockReq {\n    1: required i64 product_id\n    2: required i64 stock_num\n}\n\nstruct DecrStockResp {\n    255: base.BaseResp BaseResp\n}\n\nservice ItemService {\n    AddResp Add(1: AddReq req) // 添加商品\n    EditResp Edit(1: EditReq req) // 编辑商品\n    DeleteResp Delete(1: DeleteReq req) // 删除商品\n    OnlineResp Online(1: OnlineReq req) // 上架商品\n    OfflineResp Offline(1: OfflineReq req) // 下架商品\n    GetResp Get(1: GetReq req) // 查询商品 2B\n    MGet2CResp MGet2C(1: MGet2CReq req) // 批量查询商品 2C\n    SearchResp Search(1: SearchReq req) // 搜索商品 c端\n    ListResp List(1: ListReq req) // 商品列表 b端\n    DecrStockResp DecrStock(1: DecrStockReq req) // 扣减库存\n    DecrStockResp DecrStockRevert(1: DecrStockReq req) // 库存返还\n}\n\n\n\n"
  },
  {
    "path": "book-shop/idl/order.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\ninclude \"base.thrift\"\nnamespace go cwg.bookshop.order\n\nenum Status {\n    Finish\n    Cancel\n    Pending\n}\n\nstruct OrderItem {\n    1: i64 order_id\n    2: i64 user_id\n    3: string user_name\n    4: string address\n    5: i64 product_id\n    6: i64 stock_num\n    7: string product_snapshot\n    8: Status status\n    9: i64 create_time\n    10: i64 update_time\n}\nstruct CreateOrderReq {\n    1: required i64 user_id\n    2: required string address\n    3: required i64 product_id\n    4: required i64 stock_num\n}\n\nstruct CreateOrderResp {\n    255: base.BaseResp BaseResp\n}\n\nstruct CancelOrderReq {\n    1: required i64 order_id\n}\n\nstruct CancelOrderResp {\n    255: base.BaseResp BaseResp\n}\n\nstruct ListOrderReq {\n    1: required i64 user_id\n    2: optional Status status\n}\n\nstruct ListOrderResp {\n    1: list<OrderItem> orders\n    255: base.BaseResp BaseResp\n}\n\nstruct GetOrderByIdReq {\n    1: required i64 order_id\n}\n\nstruct GetOrderByIdResp {\n    1: OrderItem order\n    255: base.BaseResp BaseResp\n}\n\nservice OrderService {\n    CreateOrderResp CreateOrder(1: CreateOrderReq req) // 创建订单\n    CancelOrderResp CancelOrder(1: CancelOrderReq req) // 取消订单\n    ListOrderResp ListOrder(1: ListOrderReq req) // 订单列表\n    GetOrderByIdResp GetOrderById(1: GetOrderByIdReq req) // 订单详情\n}\n"
  },
  {
    "path": "book-shop/idl/user.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\ninclude \"base.thrift\"\nnamespace go cwg.bookshop.user\n\nstruct User {\n    1: i64 UserId\n    2: string UserName\n}\n\nstruct CreateUserReq {\n    1: string UserName\n    2: string Password\n}\n\nstruct CreateUserResp {\n    255: base.BaseResp BaseResp\n}\n\nstruct MGetUserReq {\n    1: list<i64> Ids\n}\n\nstruct MGetUserResp {\n    1: list<User> Users\n\n    255: base.BaseResp BaseResp\n}\n\nstruct CheckUserReq {\n    1: string UserName\n    2: string Password\n}\n\nstruct CheckUserResp {\n    1: i64 UserId\n\n    255: base.BaseResp BaseResp\n}\n\nservice UserService {\n    // 消费者端账户服务\n    CreateUserResp CreateUser(1: CreateUserReq req)\n    MGetUserResp MGetUser(1: MGetUserReq req)\n    CheckUserResp CheckUser(1: CheckUserReq req)\n}"
  },
  {
    "path": "book-shop/kitex_gen/base/base.go",
    "content": "// Code generated by thriftgo (0.1.7). DO NOT EDIT.\n\npackage base\n\nimport (\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype BaseResp struct {\n\tStatusMessage string            `thrift:\"StatusMessage,1\" json:\"StatusMessage\"`\n\tStatusCode    int32             `thrift:\"StatusCode,2\" json:\"StatusCode\"`\n\tExtra         map[string]string `thrift:\"Extra,3\" json:\"Extra,omitempty\"`\n}\n\nfunc NewBaseResp() *BaseResp {\n\treturn &BaseResp{\n\n\t\tStatusMessage: \"\",\n\t\tStatusCode:    0,\n\t}\n}\n\nfunc (p *BaseResp) GetStatusMessage() (v string) {\n\treturn p.StatusMessage\n}\n\nfunc (p *BaseResp) GetStatusCode() (v int32) {\n\treturn p.StatusCode\n}\n\nvar BaseResp_Extra_DEFAULT map[string]string\n\nfunc (p *BaseResp) GetExtra() (v map[string]string) {\n\tif !p.IsSetExtra() {\n\t\treturn BaseResp_Extra_DEFAULT\n\t}\n\treturn p.Extra\n}\nfunc (p *BaseResp) SetStatusMessage(val string) {\n\tp.StatusMessage = val\n}\nfunc (p *BaseResp) SetStatusCode(val int32) {\n\tp.StatusCode = val\n}\nfunc (p *BaseResp) SetExtra(val map[string]string) {\n\tp.Extra = val\n}\n\nvar fieldIDToName_BaseResp = map[int16]string{\n\t1: \"StatusMessage\",\n\t2: \"StatusCode\",\n\t3: \"Extra\",\n}\n\nfunc (p *BaseResp) IsSetExtra() bool {\n\treturn p.Extra != nil\n}\n\nfunc (p *BaseResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.MAP {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BaseResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusMessage = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusCode = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField3(iprot thrift.TProtocol) error {\n\t_, _, size, err := iprot.ReadMapBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Extra = make(map[string]string, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _key string\n\t\tif v, err := iprot.ReadString(); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t_key = v\n\t\t}\n\n\t\tvar _val string\n\t\tif v, err := iprot.ReadString(); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t_val = v\n\t\t}\n\n\t\tp.Extra[_key] = _val\n\t}\n\tif err := iprot.ReadMapEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"BaseResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"StatusMessage\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.StatusMessage); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"StatusCode\", thrift.I32, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI32(p.StatusCode); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetExtra() {\n\t\tif err = oprot.WriteFieldBegin(\"Extra\", thrift.MAP, 3); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(p.Extra)); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor k, v := range p.Extra {\n\n\t\t\tif err := oprot.WriteString(k); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif err := oprot.WriteString(v); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := oprot.WriteMapEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *BaseResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BaseResp(%+v)\", *p)\n}\n\nfunc (p *BaseResp) DeepEqual(ano *BaseResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.StatusMessage) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.StatusCode) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Extra) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *BaseResp) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.StatusMessage, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BaseResp) Field2DeepEqual(src int32) bool {\n\n\tif p.StatusCode != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BaseResp) Field3DeepEqual(src map[string]string) bool {\n\n\tif len(p.Extra) != len(src) {\n\t\treturn false\n\t}\n\tfor k, v := range p.Extra {\n\t\t_src := src[k]\n\t\tif strings.Compare(v, _src) != 0 {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/base/k-base.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage base\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *BaseResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.MAP {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BaseResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StatusMessage = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BaseResp) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI32(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StatusCode = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BaseResp) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, _, size, l, err := bthrift.Binary.ReadMapBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Extra = make(map[string]string, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _key string\n\t\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\n\t\t\t_key = v\n\n\t\t}\n\n\t\tvar _val string\n\t\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\n\t\t\t_val = v\n\n\t\t}\n\n\t\tp.Extra[_key] = _val\n\t}\n\tif l, err := bthrift.Binary.ReadMapEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *BaseResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *BaseResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"BaseResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"BaseResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"StatusMessage\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.StatusMessage)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"StatusCode\", thrift.I32, 2)\n\toffset += bthrift.Binary.WriteI32(buf[offset:], p.StatusCode)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetExtra() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Extra\", thrift.MAP, 3)\n\t\tmapBeginOffset := offset\n\t\toffset += bthrift.Binary.MapBeginLength(thrift.STRING, thrift.STRING, 0)\n\t\tvar length int\n\t\tfor k, v := range p.Extra {\n\t\t\tlength++\n\n\t\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, k)\n\n\t\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, v)\n\n\t\t}\n\t\tbthrift.Binary.WriteMapBegin(buf[mapBeginOffset:], thrift.STRING, thrift.STRING, length)\n\t\toffset += bthrift.Binary.WriteMapEnd(buf[offset:])\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *BaseResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"StatusMessage\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.StatusMessage)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"StatusCode\", thrift.I32, 2)\n\tl += bthrift.Binary.I32Length(p.StatusCode)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) field3Length() int {\n\tl := 0\n\tif p.IsSetExtra() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"Extra\", thrift.MAP, 3)\n\t\tl += bthrift.Binary.MapBeginLength(thrift.STRING, thrift.STRING, len(p.Extra))\n\t\tfor k, v := range p.Extra {\n\n\t\t\tl += bthrift.Binary.StringLengthNocopy(k)\n\n\t\t\tl += bthrift.Binary.StringLengthNocopy(v)\n\n\t\t}\n\t\tl += bthrift.Binary.MapEndLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/base/k-consts.go",
    "content": "package base\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/item/item.go",
    "content": "// Code generated by thriftgo (0.1.7). DO NOT EDIT.\n\npackage item\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"database/sql/driver\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/base\"\n\t\"strings\"\n)\n\ntype Status int64\n\nconst (\n\tStatus_Online  Status = 0\n\tStatus_Offline Status = 1\n\tStatus_Delete  Status = 2\n)\n\nfunc (p Status) String() string {\n\tswitch p {\n\tcase Status_Online:\n\t\treturn \"Online\"\n\tcase Status_Offline:\n\t\treturn \"Offline\"\n\tcase Status_Delete:\n\t\treturn \"Delete\"\n\t}\n\treturn \"<UNSET>\"\n}\n\nfunc StatusFromString(s string) (Status, error) {\n\tswitch s {\n\tcase \"Online\":\n\t\treturn Status_Online, nil\n\tcase \"Offline\":\n\t\treturn Status_Offline, nil\n\tcase \"Delete\":\n\t\treturn Status_Delete, nil\n\t}\n\treturn Status(0), fmt.Errorf(\"not a valid Status string\")\n}\n\nfunc StatusPtr(v Status) *Status { return &v }\n\nfunc (p *Status) Scan(value interface{}) (err error) {\n\tvar result sql.NullInt64\n\terr = result.Scan(value)\n\t*p = Status(result.Int64)\n\treturn\n}\n\nfunc (p *Status) Value() (driver.Value, error) {\n\tif p == nil {\n\t\treturn nil, nil\n\t}\n\treturn int64(*p), nil\n}\n\ntype BookProperty struct {\n\tIsbn     string `thrift:\"isbn,1\" json:\"isbn\"`\n\tSpuName  string `thrift:\"spu_name,2\" json:\"spu_name\"`\n\tSpuPrice int64  `thrift:\"spu_price,3\" json:\"spu_price\"`\n}\n\nfunc NewBookProperty() *BookProperty {\n\treturn &BookProperty{}\n}\n\nfunc (p *BookProperty) GetIsbn() (v string) {\n\treturn p.Isbn\n}\n\nfunc (p *BookProperty) GetSpuName() (v string) {\n\treturn p.SpuName\n}\n\nfunc (p *BookProperty) GetSpuPrice() (v int64) {\n\treturn p.SpuPrice\n}\nfunc (p *BookProperty) SetIsbn(val string) {\n\tp.Isbn = val\n}\nfunc (p *BookProperty) SetSpuName(val string) {\n\tp.SpuName = val\n}\nfunc (p *BookProperty) SetSpuPrice(val int64) {\n\tp.SpuPrice = val\n}\n\nvar fieldIDToName_BookProperty = map[int16]string{\n\t1: \"isbn\",\n\t2: \"spu_name\",\n\t3: \"spu_price\",\n}\n\nfunc (p *BookProperty) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BookProperty[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BookProperty) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Isbn = v\n\t}\n\treturn nil\n}\n\nfunc (p *BookProperty) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SpuName = v\n\t}\n\treturn nil\n}\n\nfunc (p *BookProperty) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SpuPrice = v\n\t}\n\treturn nil\n}\n\nfunc (p *BookProperty) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"BookProperty\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *BookProperty) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"isbn\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Isbn); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *BookProperty) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"spu_name\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.SpuName); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *BookProperty) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"spu_price\", thrift.I64, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.SpuPrice); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *BookProperty) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BookProperty(%+v)\", *p)\n}\n\nfunc (p *BookProperty) DeepEqual(ano *BookProperty) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Isbn) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.SpuName) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.SpuPrice) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *BookProperty) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Isbn, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BookProperty) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.SpuName, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BookProperty) Field3DeepEqual(src int64) bool {\n\n\tif p.SpuPrice != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Product struct {\n\tProductId   int64         `thrift:\"product_id,1\" json:\"product_id\"`\n\tName        string        `thrift:\"name,2\" json:\"name\"`\n\tPic         string        `thrift:\"pic,3\" json:\"pic\"`\n\tDescription string        `thrift:\"description,4\" json:\"description\"`\n\tProperty    *BookProperty `thrift:\"property,5\" json:\"property\"`\n\tPrice       int64         `thrift:\"price,6\" json:\"price\"`\n\tStock       int64         `thrift:\"stock,7\" json:\"stock\"`\n\tStatus      Status        `thrift:\"status,8\" json:\"status\"`\n}\n\nfunc NewProduct() *Product {\n\treturn &Product{}\n}\n\nfunc (p *Product) GetProductId() (v int64) {\n\treturn p.ProductId\n}\n\nfunc (p *Product) GetName() (v string) {\n\treturn p.Name\n}\n\nfunc (p *Product) GetPic() (v string) {\n\treturn p.Pic\n}\n\nfunc (p *Product) GetDescription() (v string) {\n\treturn p.Description\n}\n\nvar Product_Property_DEFAULT *BookProperty\n\nfunc (p *Product) GetProperty() (v *BookProperty) {\n\tif !p.IsSetProperty() {\n\t\treturn Product_Property_DEFAULT\n\t}\n\treturn p.Property\n}\n\nfunc (p *Product) GetPrice() (v int64) {\n\treturn p.Price\n}\n\nfunc (p *Product) GetStock() (v int64) {\n\treturn p.Stock\n}\n\nfunc (p *Product) GetStatus() (v Status) {\n\treturn p.Status\n}\nfunc (p *Product) SetProductId(val int64) {\n\tp.ProductId = val\n}\nfunc (p *Product) SetName(val string) {\n\tp.Name = val\n}\nfunc (p *Product) SetPic(val string) {\n\tp.Pic = val\n}\nfunc (p *Product) SetDescription(val string) {\n\tp.Description = val\n}\nfunc (p *Product) SetProperty(val *BookProperty) {\n\tp.Property = val\n}\nfunc (p *Product) SetPrice(val int64) {\n\tp.Price = val\n}\nfunc (p *Product) SetStock(val int64) {\n\tp.Stock = val\n}\nfunc (p *Product) SetStatus(val Status) {\n\tp.Status = val\n}\n\nvar fieldIDToName_Product = map[int16]string{\n\t1: \"product_id\",\n\t2: \"name\",\n\t3: \"pic\",\n\t4: \"description\",\n\t5: \"property\",\n\t6: \"price\",\n\t7: \"stock\",\n\t8: \"status\",\n}\n\nfunc (p *Product) IsSetProperty() bool {\n\treturn p.Property != nil\n}\n\nfunc (p *Product) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField6(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField7(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 8:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tif err = p.ReadField8(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Product[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Product) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Name = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Pic = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Description = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField5(iprot thrift.TProtocol) error {\n\tp.Property = NewBookProperty()\n\tif err := p.Property.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Price = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Stock = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField8(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Status = Status(v)\n\t}\n\treturn nil\n}\n\nfunc (p *Product) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Product\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField6(oprot); err != nil {\n\t\t\tfieldId = 6\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField7(oprot); err != nil {\n\t\t\tfieldId = 7\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField8(oprot); err != nil {\n\t\t\tfieldId = 8\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Product) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Product) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"name\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Name); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *Product) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"pic\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Pic); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *Product) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"description\", thrift.STRING, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Description); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *Product) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"property\", thrift.STRUCT, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Property.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *Product) writeField6(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"price\", thrift.I64, 6); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Price); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 end error: \", p), err)\n}\n\nfunc (p *Product) writeField7(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"stock\", thrift.I64, 7); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Stock); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 end error: \", p), err)\n}\n\nfunc (p *Product) writeField8(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"status\", thrift.I32, 8); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI32(int32(p.Status)); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 8 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 8 end error: \", p), err)\n}\n\nfunc (p *Product) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Product(%+v)\", *p)\n}\n\nfunc (p *Product) DeepEqual(ano *Product) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Name) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Pic) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.Description) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.Property) {\n\t\treturn false\n\t}\n\tif !p.Field6DeepEqual(ano.Price) {\n\t\treturn false\n\t}\n\tif !p.Field7DeepEqual(ano.Stock) {\n\t\treturn false\n\t}\n\tif !p.Field8DeepEqual(ano.Status) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Product) Field1DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Name, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Pic, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field4DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Description, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field5DeepEqual(src *BookProperty) bool {\n\n\tif !p.Property.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field6DeepEqual(src int64) bool {\n\n\tif p.Price != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field7DeepEqual(src int64) bool {\n\n\tif p.Stock != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field8DeepEqual(src Status) bool {\n\n\tif p.Status != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype AddReq struct {\n\tName        string        `thrift:\"name,1,required\" json:\"name\"`\n\tPic         string        `thrift:\"pic,2,required\" json:\"pic\"`\n\tDescription string        `thrift:\"description,3,required\" json:\"description\"`\n\tProperty    *BookProperty `thrift:\"property,4,required\" json:\"property\"`\n\tPrice       int64         `thrift:\"price,5,required\" json:\"price\"`\n\tStock       int64         `thrift:\"stock,6,required\" json:\"stock\"`\n}\n\nfunc NewAddReq() *AddReq {\n\treturn &AddReq{}\n}\n\nfunc (p *AddReq) GetName() (v string) {\n\treturn p.Name\n}\n\nfunc (p *AddReq) GetPic() (v string) {\n\treturn p.Pic\n}\n\nfunc (p *AddReq) GetDescription() (v string) {\n\treturn p.Description\n}\n\nvar AddReq_Property_DEFAULT *BookProperty\n\nfunc (p *AddReq) GetProperty() (v *BookProperty) {\n\tif !p.IsSetProperty() {\n\t\treturn AddReq_Property_DEFAULT\n\t}\n\treturn p.Property\n}\n\nfunc (p *AddReq) GetPrice() (v int64) {\n\treturn p.Price\n}\n\nfunc (p *AddReq) GetStock() (v int64) {\n\treturn p.Stock\n}\nfunc (p *AddReq) SetName(val string) {\n\tp.Name = val\n}\nfunc (p *AddReq) SetPic(val string) {\n\tp.Pic = val\n}\nfunc (p *AddReq) SetDescription(val string) {\n\tp.Description = val\n}\nfunc (p *AddReq) SetProperty(val *BookProperty) {\n\tp.Property = val\n}\nfunc (p *AddReq) SetPrice(val int64) {\n\tp.Price = val\n}\nfunc (p *AddReq) SetStock(val int64) {\n\tp.Stock = val\n}\n\nvar fieldIDToName_AddReq = map[int16]string{\n\t1: \"name\",\n\t2: \"pic\",\n\t3: \"description\",\n\t4: \"property\",\n\t5: \"price\",\n\t6: \"stock\",\n}\n\nfunc (p *AddReq) IsSetProperty() bool {\n\treturn p.Property != nil\n}\n\nfunc (p *AddReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetName bool = false\n\tvar issetPic bool = false\n\tvar issetDescription bool = false\n\tvar issetProperty bool = false\n\tvar issetPrice bool = false\n\tvar issetStock bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetName = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetPic = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetDescription = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProperty = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetPrice = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField6(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetStock = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetName {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetPic {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetDescription {\n\t\tfieldId = 3\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetProperty {\n\t\tfieldId = 4\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetPrice {\n\t\tfieldId = 5\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetStock {\n\t\tfieldId = 6\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_AddReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_AddReq[fieldId]))\n}\n\nfunc (p *AddReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Name = v\n\t}\n\treturn nil\n}\n\nfunc (p *AddReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Pic = v\n\t}\n\treturn nil\n}\n\nfunc (p *AddReq) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Description = v\n\t}\n\treturn nil\n}\n\nfunc (p *AddReq) ReadField4(iprot thrift.TProtocol) error {\n\tp.Property = NewBookProperty()\n\tif err := p.Property.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *AddReq) ReadField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Price = v\n\t}\n\treturn nil\n}\n\nfunc (p *AddReq) ReadField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Stock = v\n\t}\n\treturn nil\n}\n\nfunc (p *AddReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"AddReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField6(oprot); err != nil {\n\t\t\tfieldId = 6\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *AddReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"name\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Name); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *AddReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"pic\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Pic); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *AddReq) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"description\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Description); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *AddReq) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"property\", thrift.STRUCT, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Property.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *AddReq) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"price\", thrift.I64, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Price); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *AddReq) writeField6(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"stock\", thrift.I64, 6); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Stock); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 end error: \", p), err)\n}\n\nfunc (p *AddReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"AddReq(%+v)\", *p)\n}\n\nfunc (p *AddReq) DeepEqual(ano *AddReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Name) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Pic) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Description) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.Property) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.Price) {\n\t\treturn false\n\t}\n\tif !p.Field6DeepEqual(ano.Stock) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *AddReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Name, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *AddReq) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Pic, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *AddReq) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Description, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *AddReq) Field4DeepEqual(src *BookProperty) bool {\n\n\tif !p.Property.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *AddReq) Field5DeepEqual(src int64) bool {\n\n\tif p.Price != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *AddReq) Field6DeepEqual(src int64) bool {\n\n\tif p.Stock != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype AddResp struct {\n\tProductId int64          `thrift:\"product_id,1\" json:\"product_id\"`\n\tBaseResp  *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewAddResp() *AddResp {\n\treturn &AddResp{}\n}\n\nfunc (p *AddResp) GetProductId() (v int64) {\n\treturn p.ProductId\n}\n\nvar AddResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *AddResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn AddResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *AddResp) SetProductId(val int64) {\n\tp.ProductId = val\n}\nfunc (p *AddResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_AddResp = map[int16]string{\n\t1:   \"product_id\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *AddResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *AddResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_AddResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *AddResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *AddResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *AddResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"AddResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *AddResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *AddResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *AddResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"AddResp(%+v)\", *p)\n}\n\nfunc (p *AddResp) DeepEqual(ano *AddResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *AddResp) Field1DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *AddResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EditReq struct {\n\tProductId   int64         `thrift:\"product_id,1,required\" json:\"product_id\"`\n\tName        *string       `thrift:\"name,2\" json:\"name,omitempty\"`\n\tPic         *string       `thrift:\"pic,3\" json:\"pic,omitempty\"`\n\tDescription *string       `thrift:\"description,4\" json:\"description,omitempty\"`\n\tProperty    *BookProperty `thrift:\"property,5\" json:\"property,omitempty\"`\n\tPrice       *int64        `thrift:\"price,6\" json:\"price,omitempty\"`\n\tStock       *int64        `thrift:\"stock,7\" json:\"stock,omitempty\"`\n}\n\nfunc NewEditReq() *EditReq {\n\treturn &EditReq{}\n}\n\nfunc (p *EditReq) GetProductId() (v int64) {\n\treturn p.ProductId\n}\n\nvar EditReq_Name_DEFAULT string\n\nfunc (p *EditReq) GetName() (v string) {\n\tif !p.IsSetName() {\n\t\treturn EditReq_Name_DEFAULT\n\t}\n\treturn *p.Name\n}\n\nvar EditReq_Pic_DEFAULT string\n\nfunc (p *EditReq) GetPic() (v string) {\n\tif !p.IsSetPic() {\n\t\treturn EditReq_Pic_DEFAULT\n\t}\n\treturn *p.Pic\n}\n\nvar EditReq_Description_DEFAULT string\n\nfunc (p *EditReq) GetDescription() (v string) {\n\tif !p.IsSetDescription() {\n\t\treturn EditReq_Description_DEFAULT\n\t}\n\treturn *p.Description\n}\n\nvar EditReq_Property_DEFAULT *BookProperty\n\nfunc (p *EditReq) GetProperty() (v *BookProperty) {\n\tif !p.IsSetProperty() {\n\t\treturn EditReq_Property_DEFAULT\n\t}\n\treturn p.Property\n}\n\nvar EditReq_Price_DEFAULT int64\n\nfunc (p *EditReq) GetPrice() (v int64) {\n\tif !p.IsSetPrice() {\n\t\treturn EditReq_Price_DEFAULT\n\t}\n\treturn *p.Price\n}\n\nvar EditReq_Stock_DEFAULT int64\n\nfunc (p *EditReq) GetStock() (v int64) {\n\tif !p.IsSetStock() {\n\t\treturn EditReq_Stock_DEFAULT\n\t}\n\treturn *p.Stock\n}\nfunc (p *EditReq) SetProductId(val int64) {\n\tp.ProductId = val\n}\nfunc (p *EditReq) SetName(val *string) {\n\tp.Name = val\n}\nfunc (p *EditReq) SetPic(val *string) {\n\tp.Pic = val\n}\nfunc (p *EditReq) SetDescription(val *string) {\n\tp.Description = val\n}\nfunc (p *EditReq) SetProperty(val *BookProperty) {\n\tp.Property = val\n}\nfunc (p *EditReq) SetPrice(val *int64) {\n\tp.Price = val\n}\nfunc (p *EditReq) SetStock(val *int64) {\n\tp.Stock = val\n}\n\nvar fieldIDToName_EditReq = map[int16]string{\n\t1: \"product_id\",\n\t2: \"name\",\n\t3: \"pic\",\n\t4: \"description\",\n\t5: \"property\",\n\t6: \"price\",\n\t7: \"stock\",\n}\n\nfunc (p *EditReq) IsSetName() bool {\n\treturn p.Name != nil\n}\n\nfunc (p *EditReq) IsSetPic() bool {\n\treturn p.Pic != nil\n}\n\nfunc (p *EditReq) IsSetDescription() bool {\n\treturn p.Description != nil\n}\n\nfunc (p *EditReq) IsSetProperty() bool {\n\treturn p.Property != nil\n}\n\nfunc (p *EditReq) IsSetPrice() bool {\n\treturn p.Price != nil\n}\n\nfunc (p *EditReq) IsSetStock() bool {\n\treturn p.Stock != nil\n}\n\nfunc (p *EditReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField6(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField7(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EditReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_EditReq[fieldId]))\n}\n\nfunc (p *EditReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *EditReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Name = &v\n\t}\n\treturn nil\n}\n\nfunc (p *EditReq) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Pic = &v\n\t}\n\treturn nil\n}\n\nfunc (p *EditReq) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Description = &v\n\t}\n\treturn nil\n}\n\nfunc (p *EditReq) ReadField5(iprot thrift.TProtocol) error {\n\tp.Property = NewBookProperty()\n\tif err := p.Property.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EditReq) ReadField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Price = &v\n\t}\n\treturn nil\n}\n\nfunc (p *EditReq) ReadField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Stock = &v\n\t}\n\treturn nil\n}\n\nfunc (p *EditReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"EditReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField6(oprot); err != nil {\n\t\t\tfieldId = 6\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField7(oprot); err != nil {\n\t\t\tfieldId = 7\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EditReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EditReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetName() {\n\t\tif err = oprot.WriteFieldBegin(\"name\", thrift.STRING, 2); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Name); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *EditReq) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetPic() {\n\t\tif err = oprot.WriteFieldBegin(\"pic\", thrift.STRING, 3); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Pic); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *EditReq) writeField4(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetDescription() {\n\t\tif err = oprot.WriteFieldBegin(\"description\", thrift.STRING, 4); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Description); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *EditReq) writeField5(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetProperty() {\n\t\tif err = oprot.WriteFieldBegin(\"property\", thrift.STRUCT, 5); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Property.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *EditReq) writeField6(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetPrice() {\n\t\tif err = oprot.WriteFieldBegin(\"price\", thrift.I64, 6); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteI64(*p.Price); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 end error: \", p), err)\n}\n\nfunc (p *EditReq) writeField7(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetStock() {\n\t\tif err = oprot.WriteFieldBegin(\"stock\", thrift.I64, 7); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteI64(*p.Stock); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 end error: \", p), err)\n}\n\nfunc (p *EditReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EditReq(%+v)\", *p)\n}\n\nfunc (p *EditReq) DeepEqual(ano *EditReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Name) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Pic) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.Description) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.Property) {\n\t\treturn false\n\t}\n\tif !p.Field6DeepEqual(ano.Price) {\n\t\treturn false\n\t}\n\tif !p.Field7DeepEqual(ano.Stock) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EditReq) Field1DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *EditReq) Field2DeepEqual(src *string) bool {\n\n\tif p.Name == src {\n\t\treturn true\n\t} else if p.Name == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.Name, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *EditReq) Field3DeepEqual(src *string) bool {\n\n\tif p.Pic == src {\n\t\treturn true\n\t} else if p.Pic == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.Pic, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *EditReq) Field4DeepEqual(src *string) bool {\n\n\tif p.Description == src {\n\t\treturn true\n\t} else if p.Description == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.Description, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *EditReq) Field5DeepEqual(src *BookProperty) bool {\n\n\tif !p.Property.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *EditReq) Field6DeepEqual(src *int64) bool {\n\n\tif p.Price == src {\n\t\treturn true\n\t} else if p.Price == nil || src == nil {\n\t\treturn false\n\t}\n\tif *p.Price != *src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *EditReq) Field7DeepEqual(src *int64) bool {\n\n\tif p.Stock == src {\n\t\treturn true\n\t} else if p.Stock == nil || src == nil {\n\t\treturn false\n\t}\n\tif *p.Stock != *src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EditResp struct {\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewEditResp() *EditResp {\n\treturn &EditResp{}\n}\n\nvar EditResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *EditResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn EditResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *EditResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_EditResp = map[int16]string{\n\t255: \"BaseResp\",\n}\n\nfunc (p *EditResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *EditResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EditResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EditResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EditResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"EditResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EditResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *EditResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EditResp(%+v)\", *p)\n}\n\nfunc (p *EditResp) DeepEqual(ano *EditResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EditResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype DeleteReq struct {\n\tProductId int64 `thrift:\"product_id,1,required\" json:\"product_id\"`\n}\n\nfunc NewDeleteReq() *DeleteReq {\n\treturn &DeleteReq{}\n}\n\nfunc (p *DeleteReq) GetProductId() (v int64) {\n\treturn p.ProductId\n}\nfunc (p *DeleteReq) SetProductId(val int64) {\n\tp.ProductId = val\n}\n\nvar fieldIDToName_DeleteReq = map[int16]string{\n\t1: \"product_id\",\n}\n\nfunc (p *DeleteReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_DeleteReq[fieldId]))\n}\n\nfunc (p *DeleteReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *DeleteReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DeleteReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *DeleteReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DeleteReq(%+v)\", *p)\n}\n\nfunc (p *DeleteReq) DeepEqual(ano *DeleteReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *DeleteReq) Field1DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype DeleteResp struct {\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewDeleteResp() *DeleteResp {\n\treturn &DeleteResp{}\n}\n\nvar DeleteResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *DeleteResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn DeleteResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *DeleteResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_DeleteResp = map[int16]string{\n\t255: \"BaseResp\",\n}\n\nfunc (p *DeleteResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *DeleteResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DeleteResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *DeleteResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DeleteResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *DeleteResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DeleteResp(%+v)\", *p)\n}\n\nfunc (p *DeleteResp) DeepEqual(ano *DeleteResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *DeleteResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OnlineReq struct {\n\tProductId int64 `thrift:\"product_id,1,required\" json:\"product_id\"`\n}\n\nfunc NewOnlineReq() *OnlineReq {\n\treturn &OnlineReq{}\n}\n\nfunc (p *OnlineReq) GetProductId() (v int64) {\n\treturn p.ProductId\n}\nfunc (p *OnlineReq) SetProductId(val int64) {\n\tp.ProductId = val\n}\n\nvar fieldIDToName_OnlineReq = map[int16]string{\n\t1: \"product_id\",\n}\n\nfunc (p *OnlineReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OnlineReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_OnlineReq[fieldId]))\n}\n\nfunc (p *OnlineReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *OnlineReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"OnlineReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OnlineReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *OnlineReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OnlineReq(%+v)\", *p)\n}\n\nfunc (p *OnlineReq) DeepEqual(ano *OnlineReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OnlineReq) Field1DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OnlineResp struct {\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewOnlineResp() *OnlineResp {\n\treturn &OnlineResp{}\n}\n\nvar OnlineResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *OnlineResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn OnlineResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *OnlineResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_OnlineResp = map[int16]string{\n\t255: \"BaseResp\",\n}\n\nfunc (p *OnlineResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *OnlineResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OnlineResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OnlineResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OnlineResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"OnlineResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OnlineResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *OnlineResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OnlineResp(%+v)\", *p)\n}\n\nfunc (p *OnlineResp) DeepEqual(ano *OnlineResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OnlineResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OfflineReq struct {\n\tProductId int64 `thrift:\"product_id,1,required\" json:\"product_id\"`\n}\n\nfunc NewOfflineReq() *OfflineReq {\n\treturn &OfflineReq{}\n}\n\nfunc (p *OfflineReq) GetProductId() (v int64) {\n\treturn p.ProductId\n}\nfunc (p *OfflineReq) SetProductId(val int64) {\n\tp.ProductId = val\n}\n\nvar fieldIDToName_OfflineReq = map[int16]string{\n\t1: \"product_id\",\n}\n\nfunc (p *OfflineReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OfflineReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_OfflineReq[fieldId]))\n}\n\nfunc (p *OfflineReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *OfflineReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"OfflineReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OfflineReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *OfflineReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OfflineReq(%+v)\", *p)\n}\n\nfunc (p *OfflineReq) DeepEqual(ano *OfflineReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OfflineReq) Field1DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OfflineResp struct {\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewOfflineResp() *OfflineResp {\n\treturn &OfflineResp{}\n}\n\nvar OfflineResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *OfflineResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn OfflineResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *OfflineResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_OfflineResp = map[int16]string{\n\t255: \"BaseResp\",\n}\n\nfunc (p *OfflineResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *OfflineResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OfflineResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OfflineResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OfflineResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"OfflineResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OfflineResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *OfflineResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OfflineResp(%+v)\", *p)\n}\n\nfunc (p *OfflineResp) DeepEqual(ano *OfflineResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OfflineResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype GetReq struct {\n\tProductId int64 `thrift:\"product_id,1,required\" json:\"product_id\"`\n}\n\nfunc NewGetReq() *GetReq {\n\treturn &GetReq{}\n}\n\nfunc (p *GetReq) GetProductId() (v int64) {\n\treturn p.ProductId\n}\nfunc (p *GetReq) SetProductId(val int64) {\n\tp.ProductId = val\n}\n\nvar fieldIDToName_GetReq = map[int16]string{\n\t1: \"product_id\",\n}\n\nfunc (p *GetReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetReq[fieldId]))\n}\n\nfunc (p *GetReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *GetReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *GetReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *GetReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"GetReq(%+v)\", *p)\n}\n\nfunc (p *GetReq) DeepEqual(ano *GetReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *GetReq) Field1DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype GetResp struct {\n\tProduct  *Product       `thrift:\"product,1\" json:\"product\"`\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewGetResp() *GetResp {\n\treturn &GetResp{}\n}\n\nvar GetResp_Product_DEFAULT *Product\n\nfunc (p *GetResp) GetProduct() (v *Product) {\n\tif !p.IsSetProduct() {\n\t\treturn GetResp_Product_DEFAULT\n\t}\n\treturn p.Product\n}\n\nvar GetResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *GetResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn GetResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *GetResp) SetProduct(val *Product) {\n\tp.Product = val\n}\nfunc (p *GetResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_GetResp = map[int16]string{\n\t1:   \"product\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *GetResp) IsSetProduct() bool {\n\treturn p.Product != nil\n}\n\nfunc (p *GetResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *GetResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *GetResp) ReadField1(iprot thrift.TProtocol) error {\n\tp.Product = NewProduct()\n\tif err := p.Product.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *GetResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *GetResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *GetResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Product.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *GetResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *GetResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"GetResp(%+v)\", *p)\n}\n\nfunc (p *GetResp) DeepEqual(ano *GetResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Product) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *GetResp) Field1DeepEqual(src *Product) bool {\n\n\tif !p.Product.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *GetResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype MGet2CReq struct {\n\tProductIds []int64 `thrift:\"product_ids,1,required\" json:\"product_ids\"`\n}\n\nfunc NewMGet2CReq() *MGet2CReq {\n\treturn &MGet2CReq{}\n}\n\nfunc (p *MGet2CReq) GetProductIds() (v []int64) {\n\treturn p.ProductIds\n}\nfunc (p *MGet2CReq) SetProductIds(val []int64) {\n\tp.ProductIds = val\n}\n\nvar fieldIDToName_MGet2CReq = map[int16]string{\n\t1: \"product_ids\",\n}\n\nfunc (p *MGet2CReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductIds bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductIds = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductIds {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGet2CReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_MGet2CReq[fieldId]))\n}\n\nfunc (p *MGet2CReq) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.ProductIds = make([]int64, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _elem int64\n\t\tif v, err := iprot.ReadI64(); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t_elem = v\n\t\t}\n\n\t\tp.ProductIds = append(p.ProductIds, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGet2CReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGet2CReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *MGet2CReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_ids\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.I64, len(p.ProductIds)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.ProductIds {\n\t\tif err := oprot.WriteI64(v); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *MGet2CReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"MGet2CReq(%+v)\", *p)\n}\n\nfunc (p *MGet2CReq) DeepEqual(ano *MGet2CReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductIds) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *MGet2CReq) Field1DeepEqual(src []int64) bool {\n\n\tif len(p.ProductIds) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.ProductIds {\n\t\t_src := src[i]\n\t\tif v != _src {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\ntype MGet2CResp struct {\n\tProductMap map[int64]*Product `thrift:\"product_map,1\" json:\"product_map\"`\n\tBaseResp   *base.BaseResp     `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewMGet2CResp() *MGet2CResp {\n\treturn &MGet2CResp{}\n}\n\nfunc (p *MGet2CResp) GetProductMap() (v map[int64]*Product) {\n\treturn p.ProductMap\n}\n\nvar MGet2CResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *MGet2CResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn MGet2CResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *MGet2CResp) SetProductMap(val map[int64]*Product) {\n\tp.ProductMap = val\n}\nfunc (p *MGet2CResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_MGet2CResp = map[int16]string{\n\t1:   \"product_map\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *MGet2CResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *MGet2CResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.MAP {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGet2CResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGet2CResp) ReadField1(iprot thrift.TProtocol) error {\n\t_, _, size, err := iprot.ReadMapBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.ProductMap = make(map[int64]*Product, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _key int64\n\t\tif v, err := iprot.ReadI64(); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t_key = v\n\t\t}\n\t\t_val := NewProduct()\n\t\tif err := _val.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.ProductMap[_key] = _val\n\t}\n\tif err := iprot.ReadMapEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGet2CResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGet2CResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGet2CResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *MGet2CResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_map\", thrift.MAP, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteMapBegin(thrift.I64, thrift.STRUCT, len(p.ProductMap)); err != nil {\n\t\treturn err\n\t}\n\tfor k, v := range p.ProductMap {\n\n\t\tif err := oprot.WriteI64(k); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteMapEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *MGet2CResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *MGet2CResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"MGet2CResp(%+v)\", *p)\n}\n\nfunc (p *MGet2CResp) DeepEqual(ano *MGet2CResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductMap) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *MGet2CResp) Field1DeepEqual(src map[int64]*Product) bool {\n\n\tif len(p.ProductMap) != len(src) {\n\t\treturn false\n\t}\n\tfor k, v := range p.ProductMap {\n\t\t_src := src[k]\n\t\tif !v.DeepEqual(_src) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc (p *MGet2CResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype SearchReq struct {\n\tName        *string `thrift:\"name,1\" json:\"name,omitempty\"`\n\tDescription *string `thrift:\"description,2\" json:\"description,omitempty\"`\n\tSpuName     *string `thrift:\"spu_name,3\" json:\"spu_name,omitempty\"`\n}\n\nfunc NewSearchReq() *SearchReq {\n\treturn &SearchReq{}\n}\n\nvar SearchReq_Name_DEFAULT string\n\nfunc (p *SearchReq) GetName() (v string) {\n\tif !p.IsSetName() {\n\t\treturn SearchReq_Name_DEFAULT\n\t}\n\treturn *p.Name\n}\n\nvar SearchReq_Description_DEFAULT string\n\nfunc (p *SearchReq) GetDescription() (v string) {\n\tif !p.IsSetDescription() {\n\t\treturn SearchReq_Description_DEFAULT\n\t}\n\treturn *p.Description\n}\n\nvar SearchReq_SpuName_DEFAULT string\n\nfunc (p *SearchReq) GetSpuName() (v string) {\n\tif !p.IsSetSpuName() {\n\t\treturn SearchReq_SpuName_DEFAULT\n\t}\n\treturn *p.SpuName\n}\nfunc (p *SearchReq) SetName(val *string) {\n\tp.Name = val\n}\nfunc (p *SearchReq) SetDescription(val *string) {\n\tp.Description = val\n}\nfunc (p *SearchReq) SetSpuName(val *string) {\n\tp.SpuName = val\n}\n\nvar fieldIDToName_SearchReq = map[int16]string{\n\t1: \"name\",\n\t2: \"description\",\n\t3: \"spu_name\",\n}\n\nfunc (p *SearchReq) IsSetName() bool {\n\treturn p.Name != nil\n}\n\nfunc (p *SearchReq) IsSetDescription() bool {\n\treturn p.Description != nil\n}\n\nfunc (p *SearchReq) IsSetSpuName() bool {\n\treturn p.SpuName != nil\n}\n\nfunc (p *SearchReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_SearchReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *SearchReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Name = &v\n\t}\n\treturn nil\n}\n\nfunc (p *SearchReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Description = &v\n\t}\n\treturn nil\n}\n\nfunc (p *SearchReq) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SpuName = &v\n\t}\n\treturn nil\n}\n\nfunc (p *SearchReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"SearchReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *SearchReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetName() {\n\t\tif err = oprot.WriteFieldBegin(\"name\", thrift.STRING, 1); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Name); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *SearchReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetDescription() {\n\t\tif err = oprot.WriteFieldBegin(\"description\", thrift.STRING, 2); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Description); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *SearchReq) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSpuName() {\n\t\tif err = oprot.WriteFieldBegin(\"spu_name\", thrift.STRING, 3); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.SpuName); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *SearchReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"SearchReq(%+v)\", *p)\n}\n\nfunc (p *SearchReq) DeepEqual(ano *SearchReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Name) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Description) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.SpuName) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *SearchReq) Field1DeepEqual(src *string) bool {\n\n\tif p.Name == src {\n\t\treturn true\n\t} else if p.Name == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.Name, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *SearchReq) Field2DeepEqual(src *string) bool {\n\n\tif p.Description == src {\n\t\treturn true\n\t} else if p.Description == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.Description, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *SearchReq) Field3DeepEqual(src *string) bool {\n\n\tif p.SpuName == src {\n\t\treturn true\n\t} else if p.SpuName == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.SpuName, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype SearchResp struct {\n\tProducts []*Product     `thrift:\"products,1\" json:\"products\"`\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewSearchResp() *SearchResp {\n\treturn &SearchResp{}\n}\n\nfunc (p *SearchResp) GetProducts() (v []*Product) {\n\treturn p.Products\n}\n\nvar SearchResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *SearchResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn SearchResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *SearchResp) SetProducts(val []*Product) {\n\tp.Products = val\n}\nfunc (p *SearchResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_SearchResp = map[int16]string{\n\t1:   \"products\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *SearchResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *SearchResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_SearchResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *SearchResp) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Products = make([]*Product, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewProduct()\n\t\tif err := _elem.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.Products = append(p.Products, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *SearchResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *SearchResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"SearchResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *SearchResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"products\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Products)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Products {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *SearchResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *SearchResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"SearchResp(%+v)\", *p)\n}\n\nfunc (p *SearchResp) DeepEqual(ano *SearchResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Products) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *SearchResp) Field1DeepEqual(src []*Product) bool {\n\n\tif len(p.Products) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.Products {\n\t\t_src := src[i]\n\t\tif !v.DeepEqual(_src) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc (p *SearchResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ListReq struct {\n\tName    *string `thrift:\"name,1\" json:\"name,omitempty\"`\n\tSpuName *string `thrift:\"spu_name,2\" json:\"spu_name,omitempty\"`\n\tStatus  *Status `thrift:\"status,3\" json:\"status,omitempty\"`\n}\n\nfunc NewListReq() *ListReq {\n\treturn &ListReq{}\n}\n\nvar ListReq_Name_DEFAULT string\n\nfunc (p *ListReq) GetName() (v string) {\n\tif !p.IsSetName() {\n\t\treturn ListReq_Name_DEFAULT\n\t}\n\treturn *p.Name\n}\n\nvar ListReq_SpuName_DEFAULT string\n\nfunc (p *ListReq) GetSpuName() (v string) {\n\tif !p.IsSetSpuName() {\n\t\treturn ListReq_SpuName_DEFAULT\n\t}\n\treturn *p.SpuName\n}\n\nvar ListReq_Status_DEFAULT Status\n\nfunc (p *ListReq) GetStatus() (v Status) {\n\tif !p.IsSetStatus() {\n\t\treturn ListReq_Status_DEFAULT\n\t}\n\treturn *p.Status\n}\nfunc (p *ListReq) SetName(val *string) {\n\tp.Name = val\n}\nfunc (p *ListReq) SetSpuName(val *string) {\n\tp.SpuName = val\n}\nfunc (p *ListReq) SetStatus(val *Status) {\n\tp.Status = val\n}\n\nvar fieldIDToName_ListReq = map[int16]string{\n\t1: \"name\",\n\t2: \"spu_name\",\n\t3: \"status\",\n}\n\nfunc (p *ListReq) IsSetName() bool {\n\treturn p.Name != nil\n}\n\nfunc (p *ListReq) IsSetSpuName() bool {\n\treturn p.SpuName != nil\n}\n\nfunc (p *ListReq) IsSetStatus() bool {\n\treturn p.Status != nil\n}\n\nfunc (p *ListReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ListReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Name = &v\n\t}\n\treturn nil\n}\n\nfunc (p *ListReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SpuName = &v\n\t}\n\treturn nil\n}\n\nfunc (p *ListReq) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn err\n\t} else {\n\t\ttmp := Status(v)\n\t\tp.Status = &tmp\n\t}\n\treturn nil\n}\n\nfunc (p *ListReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ListReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ListReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetName() {\n\t\tif err = oprot.WriteFieldBegin(\"name\", thrift.STRING, 1); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Name); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ListReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSpuName() {\n\t\tif err = oprot.WriteFieldBegin(\"spu_name\", thrift.STRING, 2); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.SpuName); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *ListReq) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetStatus() {\n\t\tif err = oprot.WriteFieldBegin(\"status\", thrift.I32, 3); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteI32(int32(*p.Status)); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *ListReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ListReq(%+v)\", *p)\n}\n\nfunc (p *ListReq) DeepEqual(ano *ListReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Name) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.SpuName) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Status) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ListReq) Field1DeepEqual(src *string) bool {\n\n\tif p.Name == src {\n\t\treturn true\n\t} else if p.Name == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.Name, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *ListReq) Field2DeepEqual(src *string) bool {\n\n\tif p.SpuName == src {\n\t\treturn true\n\t} else if p.SpuName == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.SpuName, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *ListReq) Field3DeepEqual(src *Status) bool {\n\n\tif p.Status == src {\n\t\treturn true\n\t} else if p.Status == nil || src == nil {\n\t\treturn false\n\t}\n\tif *p.Status != *src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ListResp struct {\n\tProducts []*Product     `thrift:\"products,1\" json:\"products\"`\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewListResp() *ListResp {\n\treturn &ListResp{}\n}\n\nfunc (p *ListResp) GetProducts() (v []*Product) {\n\treturn p.Products\n}\n\nvar ListResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *ListResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn ListResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *ListResp) SetProducts(val []*Product) {\n\tp.Products = val\n}\nfunc (p *ListResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_ListResp = map[int16]string{\n\t1:   \"products\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *ListResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *ListResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ListResp) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Products = make([]*Product, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewProduct()\n\t\tif err := _elem.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.Products = append(p.Products, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ListResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ListResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ListResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ListResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"products\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Products)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Products {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ListResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *ListResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ListResp(%+v)\", *p)\n}\n\nfunc (p *ListResp) DeepEqual(ano *ListResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Products) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ListResp) Field1DeepEqual(src []*Product) bool {\n\n\tif len(p.Products) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.Products {\n\t\t_src := src[i]\n\t\tif !v.DeepEqual(_src) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc (p *ListResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype DecrStockReq struct {\n\tProductId int64 `thrift:\"product_id,1,required\" json:\"product_id\"`\n\tStockNum  int64 `thrift:\"stock_num,2,required\" json:\"stock_num\"`\n}\n\nfunc NewDecrStockReq() *DecrStockReq {\n\treturn &DecrStockReq{}\n}\n\nfunc (p *DecrStockReq) GetProductId() (v int64) {\n\treturn p.ProductId\n}\n\nfunc (p *DecrStockReq) GetStockNum() (v int64) {\n\treturn p.StockNum\n}\nfunc (p *DecrStockReq) SetProductId(val int64) {\n\tp.ProductId = val\n}\nfunc (p *DecrStockReq) SetStockNum(val int64) {\n\tp.StockNum = val\n}\n\nvar fieldIDToName_DecrStockReq = map[int16]string{\n\t1: \"product_id\",\n\t2: \"stock_num\",\n}\n\nfunc (p *DecrStockReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\tvar issetStockNum bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetStockNum = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetStockNum {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DecrStockReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_DecrStockReq[fieldId]))\n}\n\nfunc (p *DecrStockReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *DecrStockReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StockNum = v\n\t}\n\treturn nil\n}\n\nfunc (p *DecrStockReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DecrStockReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DecrStockReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *DecrStockReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"stock_num\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.StockNum); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *DecrStockReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DecrStockReq(%+v)\", *p)\n}\n\nfunc (p *DecrStockReq) DeepEqual(ano *DecrStockReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.StockNum) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *DecrStockReq) Field1DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *DecrStockReq) Field2DeepEqual(src int64) bool {\n\n\tif p.StockNum != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype DecrStockResp struct {\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewDecrStockResp() *DecrStockResp {\n\treturn &DecrStockResp{}\n}\n\nvar DecrStockResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *DecrStockResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn DecrStockResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *DecrStockResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_DecrStockResp = map[int16]string{\n\t255: \"BaseResp\",\n}\n\nfunc (p *DecrStockResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *DecrStockResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DecrStockResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DecrStockResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *DecrStockResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DecrStockResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DecrStockResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *DecrStockResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DecrStockResp(%+v)\", *p)\n}\n\nfunc (p *DecrStockResp) DeepEqual(ano *DecrStockResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *DecrStockResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemService interface {\n\tAdd(ctx context.Context, req *AddReq) (r *AddResp, err error)\n\n\tEdit(ctx context.Context, req *EditReq) (r *EditResp, err error)\n\n\tDelete(ctx context.Context, req *DeleteReq) (r *DeleteResp, err error)\n\n\tOnline(ctx context.Context, req *OnlineReq) (r *OnlineResp, err error)\n\n\tOffline(ctx context.Context, req *OfflineReq) (r *OfflineResp, err error)\n\n\tGet(ctx context.Context, req *GetReq) (r *GetResp, err error)\n\n\tMGet2C(ctx context.Context, req *MGet2CReq) (r *MGet2CResp, err error)\n\n\tSearch(ctx context.Context, req *SearchReq) (r *SearchResp, err error)\n\n\tList(ctx context.Context, req *ListReq) (r *ListResp, err error)\n\n\tDecrStock(ctx context.Context, req *DecrStockReq) (r *DecrStockResp, err error)\n\n\tDecrStockRevert(ctx context.Context, req *DecrStockReq) (r *DecrStockResp, err error)\n}\n\ntype ItemServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewItemServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *ItemServiceClient {\n\treturn &ItemServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewItemServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *ItemServiceClient {\n\treturn &ItemServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewItemServiceClient(c thrift.TClient) *ItemServiceClient {\n\treturn &ItemServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *ItemServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *ItemServiceClient) Add(ctx context.Context, req *AddReq) (r *AddResp, err error) {\n\tvar _args ItemServiceAddArgs\n\t_args.Req = req\n\tvar _result ItemServiceAddResult\n\tif err = p.Client_().Call(ctx, \"Add\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) Edit(ctx context.Context, req *EditReq) (r *EditResp, err error) {\n\tvar _args ItemServiceEditArgs\n\t_args.Req = req\n\tvar _result ItemServiceEditResult\n\tif err = p.Client_().Call(ctx, \"Edit\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) Delete(ctx context.Context, req *DeleteReq) (r *DeleteResp, err error) {\n\tvar _args ItemServiceDeleteArgs\n\t_args.Req = req\n\tvar _result ItemServiceDeleteResult\n\tif err = p.Client_().Call(ctx, \"Delete\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) Online(ctx context.Context, req *OnlineReq) (r *OnlineResp, err error) {\n\tvar _args ItemServiceOnlineArgs\n\t_args.Req = req\n\tvar _result ItemServiceOnlineResult\n\tif err = p.Client_().Call(ctx, \"Online\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) Offline(ctx context.Context, req *OfflineReq) (r *OfflineResp, err error) {\n\tvar _args ItemServiceOfflineArgs\n\t_args.Req = req\n\tvar _result ItemServiceOfflineResult\n\tif err = p.Client_().Call(ctx, \"Offline\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) Get(ctx context.Context, req *GetReq) (r *GetResp, err error) {\n\tvar _args ItemServiceGetArgs\n\t_args.Req = req\n\tvar _result ItemServiceGetResult\n\tif err = p.Client_().Call(ctx, \"Get\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) MGet2C(ctx context.Context, req *MGet2CReq) (r *MGet2CResp, err error) {\n\tvar _args ItemServiceMGet2CArgs\n\t_args.Req = req\n\tvar _result ItemServiceMGet2CResult\n\tif err = p.Client_().Call(ctx, \"MGet2C\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) Search(ctx context.Context, req *SearchReq) (r *SearchResp, err error) {\n\tvar _args ItemServiceSearchArgs\n\t_args.Req = req\n\tvar _result ItemServiceSearchResult\n\tif err = p.Client_().Call(ctx, \"Search\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) List(ctx context.Context, req *ListReq) (r *ListResp, err error) {\n\tvar _args ItemServiceListArgs\n\t_args.Req = req\n\tvar _result ItemServiceListResult\n\tif err = p.Client_().Call(ctx, \"List\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) DecrStock(ctx context.Context, req *DecrStockReq) (r *DecrStockResp, err error) {\n\tvar _args ItemServiceDecrStockArgs\n\t_args.Req = req\n\tvar _result ItemServiceDecrStockResult\n\tif err = p.Client_().Call(ctx, \"DecrStock\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *ItemServiceClient) DecrStockRevert(ctx context.Context, req *DecrStockReq) (r *DecrStockResp, err error) {\n\tvar _args ItemServiceDecrStockRevertArgs\n\t_args.Req = req\n\tvar _result ItemServiceDecrStockRevertResult\n\tif err = p.Client_().Call(ctx, \"DecrStockRevert\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype ItemServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      ItemService\n}\n\nfunc (p *ItemServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *ItemServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *ItemServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewItemServiceProcessor(handler ItemService) *ItemServiceProcessor {\n\tself := &ItemServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"Add\", &itemServiceProcessorAdd{handler: handler})\n\tself.AddToProcessorMap(\"Edit\", &itemServiceProcessorEdit{handler: handler})\n\tself.AddToProcessorMap(\"Delete\", &itemServiceProcessorDelete{handler: handler})\n\tself.AddToProcessorMap(\"Online\", &itemServiceProcessorOnline{handler: handler})\n\tself.AddToProcessorMap(\"Offline\", &itemServiceProcessorOffline{handler: handler})\n\tself.AddToProcessorMap(\"Get\", &itemServiceProcessorGet{handler: handler})\n\tself.AddToProcessorMap(\"MGet2C\", &itemServiceProcessorMGet2C{handler: handler})\n\tself.AddToProcessorMap(\"Search\", &itemServiceProcessorSearch{handler: handler})\n\tself.AddToProcessorMap(\"List\", &itemServiceProcessorList{handler: handler})\n\tself.AddToProcessorMap(\"DecrStock\", &itemServiceProcessorDecrStock{handler: handler})\n\tself.AddToProcessorMap(\"DecrStockRevert\", &itemServiceProcessorDecrStockRevert{handler: handler})\n\treturn self\n}\nfunc (p *ItemServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype itemServiceProcessorAdd struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorAdd) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceAddArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"Add\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceAddResult{}\n\tvar retval *AddResp\n\tif retval, err2 = p.handler.Add(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing Add: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"Add\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"Add\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorEdit struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorEdit) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceEditArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"Edit\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceEditResult{}\n\tvar retval *EditResp\n\tif retval, err2 = p.handler.Edit(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing Edit: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"Edit\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"Edit\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorDelete struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorDelete) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceDeleteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"Delete\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceDeleteResult{}\n\tvar retval *DeleteResp\n\tif retval, err2 = p.handler.Delete(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing Delete: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"Delete\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"Delete\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorOnline struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorOnline) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceOnlineArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"Online\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceOnlineResult{}\n\tvar retval *OnlineResp\n\tif retval, err2 = p.handler.Online(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing Online: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"Online\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"Online\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorOffline struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorOffline) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceOfflineArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"Offline\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceOfflineResult{}\n\tvar retval *OfflineResp\n\tif retval, err2 = p.handler.Offline(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing Offline: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"Offline\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"Offline\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorGet struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorGet) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceGetArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"Get\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceGetResult{}\n\tvar retval *GetResp\n\tif retval, err2 = p.handler.Get(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing Get: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"Get\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"Get\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorMGet2C struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorMGet2C) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceMGet2CArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"MGet2C\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceMGet2CResult{}\n\tvar retval *MGet2CResp\n\tif retval, err2 = p.handler.MGet2C(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing MGet2C: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"MGet2C\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"MGet2C\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorSearch struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorSearch) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceSearchArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"Search\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceSearchResult{}\n\tvar retval *SearchResp\n\tif retval, err2 = p.handler.Search(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing Search: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"Search\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"Search\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorList struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorList) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceListArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"List\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceListResult{}\n\tvar retval *ListResp\n\tif retval, err2 = p.handler.List(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing List: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"List\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"List\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorDecrStock struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorDecrStock) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceDecrStockArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"DecrStock\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceDecrStockResult{}\n\tvar retval *DecrStockResp\n\tif retval, err2 = p.handler.DecrStock(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing DecrStock: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"DecrStock\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"DecrStock\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype itemServiceProcessorDecrStockRevert struct {\n\thandler ItemService\n}\n\nfunc (p *itemServiceProcessorDecrStockRevert) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ItemServiceDecrStockRevertArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"DecrStockRevert\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ItemServiceDecrStockRevertResult{}\n\tvar retval *DecrStockResp\n\tif retval, err2 = p.handler.DecrStockRevert(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing DecrStockRevert: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"DecrStockRevert\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"DecrStockRevert\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype ItemServiceAddArgs struct {\n\tReq *AddReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceAddArgs() *ItemServiceAddArgs {\n\treturn &ItemServiceAddArgs{}\n}\n\nvar ItemServiceAddArgs_Req_DEFAULT *AddReq\n\nfunc (p *ItemServiceAddArgs) GetReq() (v *AddReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceAddArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceAddArgs) SetReq(val *AddReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceAddArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceAddArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceAddArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceAddArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceAddArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewAddReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceAddArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Add_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceAddArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceAddArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceAddArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceAddArgs) DeepEqual(ano *ItemServiceAddArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceAddArgs) Field1DeepEqual(src *AddReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceAddResult struct {\n\tSuccess *AddResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceAddResult() *ItemServiceAddResult {\n\treturn &ItemServiceAddResult{}\n}\n\nvar ItemServiceAddResult_Success_DEFAULT *AddResp\n\nfunc (p *ItemServiceAddResult) GetSuccess() (v *AddResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceAddResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceAddResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*AddResp)\n}\n\nvar fieldIDToName_ItemServiceAddResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceAddResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceAddResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceAddResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceAddResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewAddResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceAddResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Add_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceAddResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceAddResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceAddResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceAddResult) DeepEqual(ano *ItemServiceAddResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceAddResult) Field0DeepEqual(src *AddResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceEditArgs struct {\n\tReq *EditReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceEditArgs() *ItemServiceEditArgs {\n\treturn &ItemServiceEditArgs{}\n}\n\nvar ItemServiceEditArgs_Req_DEFAULT *EditReq\n\nfunc (p *ItemServiceEditArgs) GetReq() (v *EditReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceEditArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceEditArgs) SetReq(val *EditReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceEditArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceEditArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceEditArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceEditArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceEditArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewEditReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceEditArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Edit_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceEditArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceEditArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceEditArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceEditArgs) DeepEqual(ano *ItemServiceEditArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceEditArgs) Field1DeepEqual(src *EditReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceEditResult struct {\n\tSuccess *EditResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceEditResult() *ItemServiceEditResult {\n\treturn &ItemServiceEditResult{}\n}\n\nvar ItemServiceEditResult_Success_DEFAULT *EditResp\n\nfunc (p *ItemServiceEditResult) GetSuccess() (v *EditResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceEditResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceEditResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*EditResp)\n}\n\nvar fieldIDToName_ItemServiceEditResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceEditResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceEditResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceEditResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceEditResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewEditResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceEditResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Edit_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceEditResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceEditResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceEditResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceEditResult) DeepEqual(ano *ItemServiceEditResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceEditResult) Field0DeepEqual(src *EditResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceDeleteArgs struct {\n\tReq *DeleteReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceDeleteArgs() *ItemServiceDeleteArgs {\n\treturn &ItemServiceDeleteArgs{}\n}\n\nvar ItemServiceDeleteArgs_Req_DEFAULT *DeleteReq\n\nfunc (p *ItemServiceDeleteArgs) GetReq() (v *DeleteReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceDeleteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceDeleteArgs) SetReq(val *DeleteReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceDeleteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceDeleteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceDeleteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDeleteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDeleteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewDeleteReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceDeleteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Delete_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDeleteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceDeleteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceDeleteArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceDeleteArgs) DeepEqual(ano *ItemServiceDeleteArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceDeleteArgs) Field1DeepEqual(src *DeleteReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceDeleteResult struct {\n\tSuccess *DeleteResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceDeleteResult() *ItemServiceDeleteResult {\n\treturn &ItemServiceDeleteResult{}\n}\n\nvar ItemServiceDeleteResult_Success_DEFAULT *DeleteResp\n\nfunc (p *ItemServiceDeleteResult) GetSuccess() (v *DeleteResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceDeleteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceDeleteResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*DeleteResp)\n}\n\nvar fieldIDToName_ItemServiceDeleteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceDeleteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceDeleteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDeleteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDeleteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewDeleteResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceDeleteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Delete_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDeleteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceDeleteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceDeleteResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceDeleteResult) DeepEqual(ano *ItemServiceDeleteResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceDeleteResult) Field0DeepEqual(src *DeleteResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceOnlineArgs struct {\n\tReq *OnlineReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceOnlineArgs() *ItemServiceOnlineArgs {\n\treturn &ItemServiceOnlineArgs{}\n}\n\nvar ItemServiceOnlineArgs_Req_DEFAULT *OnlineReq\n\nfunc (p *ItemServiceOnlineArgs) GetReq() (v *OnlineReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceOnlineArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceOnlineArgs) SetReq(val *OnlineReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceOnlineArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceOnlineArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceOnlineArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceOnlineArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOnlineArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewOnlineReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceOnlineArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Online_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOnlineArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceOnlineArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceOnlineArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceOnlineArgs) DeepEqual(ano *ItemServiceOnlineArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceOnlineArgs) Field1DeepEqual(src *OnlineReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceOnlineResult struct {\n\tSuccess *OnlineResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceOnlineResult() *ItemServiceOnlineResult {\n\treturn &ItemServiceOnlineResult{}\n}\n\nvar ItemServiceOnlineResult_Success_DEFAULT *OnlineResp\n\nfunc (p *ItemServiceOnlineResult) GetSuccess() (v *OnlineResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceOnlineResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceOnlineResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*OnlineResp)\n}\n\nvar fieldIDToName_ItemServiceOnlineResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceOnlineResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceOnlineResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceOnlineResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOnlineResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewOnlineResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceOnlineResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Online_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOnlineResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceOnlineResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceOnlineResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceOnlineResult) DeepEqual(ano *ItemServiceOnlineResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceOnlineResult) Field0DeepEqual(src *OnlineResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceOfflineArgs struct {\n\tReq *OfflineReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceOfflineArgs() *ItemServiceOfflineArgs {\n\treturn &ItemServiceOfflineArgs{}\n}\n\nvar ItemServiceOfflineArgs_Req_DEFAULT *OfflineReq\n\nfunc (p *ItemServiceOfflineArgs) GetReq() (v *OfflineReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceOfflineArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceOfflineArgs) SetReq(val *OfflineReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceOfflineArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceOfflineArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceOfflineArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceOfflineArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOfflineArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewOfflineReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceOfflineArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Offline_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOfflineArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceOfflineArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceOfflineArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceOfflineArgs) DeepEqual(ano *ItemServiceOfflineArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceOfflineArgs) Field1DeepEqual(src *OfflineReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceOfflineResult struct {\n\tSuccess *OfflineResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceOfflineResult() *ItemServiceOfflineResult {\n\treturn &ItemServiceOfflineResult{}\n}\n\nvar ItemServiceOfflineResult_Success_DEFAULT *OfflineResp\n\nfunc (p *ItemServiceOfflineResult) GetSuccess() (v *OfflineResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceOfflineResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceOfflineResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*OfflineResp)\n}\n\nvar fieldIDToName_ItemServiceOfflineResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceOfflineResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceOfflineResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceOfflineResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOfflineResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewOfflineResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceOfflineResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Offline_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOfflineResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceOfflineResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceOfflineResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceOfflineResult) DeepEqual(ano *ItemServiceOfflineResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceOfflineResult) Field0DeepEqual(src *OfflineResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceGetArgs struct {\n\tReq *GetReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceGetArgs() *ItemServiceGetArgs {\n\treturn &ItemServiceGetArgs{}\n}\n\nvar ItemServiceGetArgs_Req_DEFAULT *GetReq\n\nfunc (p *ItemServiceGetArgs) GetReq() (v *GetReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceGetArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceGetArgs) SetReq(val *GetReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceGetArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceGetArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceGetArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceGetArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceGetArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewGetReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceGetArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Get_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceGetArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceGetArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceGetArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceGetArgs) DeepEqual(ano *ItemServiceGetArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceGetArgs) Field1DeepEqual(src *GetReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceGetResult struct {\n\tSuccess *GetResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceGetResult() *ItemServiceGetResult {\n\treturn &ItemServiceGetResult{}\n}\n\nvar ItemServiceGetResult_Success_DEFAULT *GetResp\n\nfunc (p *ItemServiceGetResult) GetSuccess() (v *GetResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceGetResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceGetResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*GetResp)\n}\n\nvar fieldIDToName_ItemServiceGetResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceGetResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceGetResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceGetResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceGetResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewGetResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceGetResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Get_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceGetResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceGetResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceGetResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceGetResult) DeepEqual(ano *ItemServiceGetResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceGetResult) Field0DeepEqual(src *GetResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceMGet2CArgs struct {\n\tReq *MGet2CReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceMGet2CArgs() *ItemServiceMGet2CArgs {\n\treturn &ItemServiceMGet2CArgs{}\n}\n\nvar ItemServiceMGet2CArgs_Req_DEFAULT *MGet2CReq\n\nfunc (p *ItemServiceMGet2CArgs) GetReq() (v *MGet2CReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceMGet2CArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceMGet2CArgs) SetReq(val *MGet2CReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceMGet2CArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceMGet2CArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceMGet2CArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceMGet2CArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceMGet2CArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewMGet2CReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceMGet2CArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGet2C_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceMGet2CArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceMGet2CArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceMGet2CArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceMGet2CArgs) DeepEqual(ano *ItemServiceMGet2CArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceMGet2CArgs) Field1DeepEqual(src *MGet2CReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceMGet2CResult struct {\n\tSuccess *MGet2CResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceMGet2CResult() *ItemServiceMGet2CResult {\n\treturn &ItemServiceMGet2CResult{}\n}\n\nvar ItemServiceMGet2CResult_Success_DEFAULT *MGet2CResp\n\nfunc (p *ItemServiceMGet2CResult) GetSuccess() (v *MGet2CResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceMGet2CResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceMGet2CResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*MGet2CResp)\n}\n\nvar fieldIDToName_ItemServiceMGet2CResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceMGet2CResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceMGet2CResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceMGet2CResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceMGet2CResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewMGet2CResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceMGet2CResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGet2C_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceMGet2CResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceMGet2CResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceMGet2CResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceMGet2CResult) DeepEqual(ano *ItemServiceMGet2CResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceMGet2CResult) Field0DeepEqual(src *MGet2CResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceSearchArgs struct {\n\tReq *SearchReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceSearchArgs() *ItemServiceSearchArgs {\n\treturn &ItemServiceSearchArgs{}\n}\n\nvar ItemServiceSearchArgs_Req_DEFAULT *SearchReq\n\nfunc (p *ItemServiceSearchArgs) GetReq() (v *SearchReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceSearchArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceSearchArgs) SetReq(val *SearchReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceSearchArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceSearchArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceSearchArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceSearchArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceSearchArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewSearchReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceSearchArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Search_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceSearchArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceSearchArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceSearchArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceSearchArgs) DeepEqual(ano *ItemServiceSearchArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceSearchArgs) Field1DeepEqual(src *SearchReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceSearchResult struct {\n\tSuccess *SearchResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceSearchResult() *ItemServiceSearchResult {\n\treturn &ItemServiceSearchResult{}\n}\n\nvar ItemServiceSearchResult_Success_DEFAULT *SearchResp\n\nfunc (p *ItemServiceSearchResult) GetSuccess() (v *SearchResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceSearchResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceSearchResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*SearchResp)\n}\n\nvar fieldIDToName_ItemServiceSearchResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceSearchResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceSearchResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceSearchResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceSearchResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewSearchResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceSearchResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Search_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceSearchResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceSearchResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceSearchResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceSearchResult) DeepEqual(ano *ItemServiceSearchResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceSearchResult) Field0DeepEqual(src *SearchResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceListArgs struct {\n\tReq *ListReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceListArgs() *ItemServiceListArgs {\n\treturn &ItemServiceListArgs{}\n}\n\nvar ItemServiceListArgs_Req_DEFAULT *ListReq\n\nfunc (p *ItemServiceListArgs) GetReq() (v *ListReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceListArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceListArgs) SetReq(val *ListReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceListArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceListArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceListArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceListArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceListArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewListReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceListArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"List_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceListArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceListArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceListArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceListArgs) DeepEqual(ano *ItemServiceListArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceListArgs) Field1DeepEqual(src *ListReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceListResult struct {\n\tSuccess *ListResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceListResult() *ItemServiceListResult {\n\treturn &ItemServiceListResult{}\n}\n\nvar ItemServiceListResult_Success_DEFAULT *ListResp\n\nfunc (p *ItemServiceListResult) GetSuccess() (v *ListResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceListResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceListResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*ListResp)\n}\n\nvar fieldIDToName_ItemServiceListResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceListResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceListResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceListResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceListResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewListResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceListResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"List_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceListResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceListResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceListResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceListResult) DeepEqual(ano *ItemServiceListResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceListResult) Field0DeepEqual(src *ListResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceDecrStockArgs struct {\n\tReq *DecrStockReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceDecrStockArgs() *ItemServiceDecrStockArgs {\n\treturn &ItemServiceDecrStockArgs{}\n}\n\nvar ItemServiceDecrStockArgs_Req_DEFAULT *DecrStockReq\n\nfunc (p *ItemServiceDecrStockArgs) GetReq() (v *DecrStockReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceDecrStockArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceDecrStockArgs) SetReq(val *DecrStockReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceDecrStockArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceDecrStockArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceDecrStockArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDecrStockArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewDecrStockReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceDecrStockArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DecrStock_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceDecrStockArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceDecrStockArgs) DeepEqual(ano *ItemServiceDecrStockArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceDecrStockArgs) Field1DeepEqual(src *DecrStockReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceDecrStockResult struct {\n\tSuccess *DecrStockResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceDecrStockResult() *ItemServiceDecrStockResult {\n\treturn &ItemServiceDecrStockResult{}\n}\n\nvar ItemServiceDecrStockResult_Success_DEFAULT *DecrStockResp\n\nfunc (p *ItemServiceDecrStockResult) GetSuccess() (v *DecrStockResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceDecrStockResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceDecrStockResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*DecrStockResp)\n}\n\nvar fieldIDToName_ItemServiceDecrStockResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceDecrStockResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceDecrStockResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDecrStockResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewDecrStockResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceDecrStockResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DecrStock_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceDecrStockResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceDecrStockResult) DeepEqual(ano *ItemServiceDecrStockResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceDecrStockResult) Field0DeepEqual(src *DecrStockResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceDecrStockRevertArgs struct {\n\tReq *DecrStockReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewItemServiceDecrStockRevertArgs() *ItemServiceDecrStockRevertArgs {\n\treturn &ItemServiceDecrStockRevertArgs{}\n}\n\nvar ItemServiceDecrStockRevertArgs_Req_DEFAULT *DecrStockReq\n\nfunc (p *ItemServiceDecrStockRevertArgs) GetReq() (v *DecrStockReq) {\n\tif !p.IsSetReq() {\n\t\treturn ItemServiceDecrStockRevertArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ItemServiceDecrStockRevertArgs) SetReq(val *DecrStockReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ItemServiceDecrStockRevertArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDecrStockRevertArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewDecrStockReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DecrStockRevert_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceDecrStockRevertArgs(%+v)\", *p)\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) DeepEqual(ano *ItemServiceDecrStockRevertArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) Field1DeepEqual(src *DecrStockReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ItemServiceDecrStockRevertResult struct {\n\tSuccess *DecrStockResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewItemServiceDecrStockRevertResult() *ItemServiceDecrStockRevertResult {\n\treturn &ItemServiceDecrStockRevertResult{}\n}\n\nvar ItemServiceDecrStockRevertResult_Success_DEFAULT *DecrStockResp\n\nfunc (p *ItemServiceDecrStockRevertResult) GetSuccess() (v *DecrStockResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ItemServiceDecrStockRevertResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ItemServiceDecrStockRevertResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*DecrStockResp)\n}\n\nvar fieldIDToName_ItemServiceDecrStockRevertResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDecrStockRevertResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewDecrStockResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DecrStockRevert_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ItemServiceDecrStockRevertResult(%+v)\", *p)\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) DeepEqual(ano *ItemServiceDecrStockRevertResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) Field0DeepEqual(src *DecrStockResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/item/itemservice/client.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage itemservice\n\nimport (\n\t\"context\"\n\titem \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tAdd(ctx context.Context, req *item.AddReq, callOptions ...callopt.Option) (r *item.AddResp, err error)\n\tEdit(ctx context.Context, req *item.EditReq, callOptions ...callopt.Option) (r *item.EditResp, err error)\n\tDelete(ctx context.Context, req *item.DeleteReq, callOptions ...callopt.Option) (r *item.DeleteResp, err error)\n\tOnline(ctx context.Context, req *item.OnlineReq, callOptions ...callopt.Option) (r *item.OnlineResp, err error)\n\tOffline(ctx context.Context, req *item.OfflineReq, callOptions ...callopt.Option) (r *item.OfflineResp, err error)\n\tGet(ctx context.Context, req *item.GetReq, callOptions ...callopt.Option) (r *item.GetResp, err error)\n\tMGet2C(ctx context.Context, req *item.MGet2CReq, callOptions ...callopt.Option) (r *item.MGet2CResp, err error)\n\tSearch(ctx context.Context, req *item.SearchReq, callOptions ...callopt.Option) (r *item.SearchResp, err error)\n\tList(ctx context.Context, req *item.ListReq, callOptions ...callopt.Option) (r *item.ListResp, err error)\n\tDecrStock(ctx context.Context, req *item.DecrStockReq, callOptions ...callopt.Option) (r *item.DecrStockResp, err error)\n\tDecrStockRevert(ctx context.Context, req *item.DecrStockReq, callOptions ...callopt.Option) (r *item.DecrStockResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kItemServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kItemServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kItemServiceClient) Add(ctx context.Context, req *item.AddReq, callOptions ...callopt.Option) (r *item.AddResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Add(ctx, req)\n}\n\nfunc (p *kItemServiceClient) Edit(ctx context.Context, req *item.EditReq, callOptions ...callopt.Option) (r *item.EditResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Edit(ctx, req)\n}\n\nfunc (p *kItemServiceClient) Delete(ctx context.Context, req *item.DeleteReq, callOptions ...callopt.Option) (r *item.DeleteResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Delete(ctx, req)\n}\n\nfunc (p *kItemServiceClient) Online(ctx context.Context, req *item.OnlineReq, callOptions ...callopt.Option) (r *item.OnlineResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Online(ctx, req)\n}\n\nfunc (p *kItemServiceClient) Offline(ctx context.Context, req *item.OfflineReq, callOptions ...callopt.Option) (r *item.OfflineResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Offline(ctx, req)\n}\n\nfunc (p *kItemServiceClient) Get(ctx context.Context, req *item.GetReq, callOptions ...callopt.Option) (r *item.GetResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Get(ctx, req)\n}\n\nfunc (p *kItemServiceClient) MGet2C(ctx context.Context, req *item.MGet2CReq, callOptions ...callopt.Option) (r *item.MGet2CResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.MGet2C(ctx, req)\n}\n\nfunc (p *kItemServiceClient) Search(ctx context.Context, req *item.SearchReq, callOptions ...callopt.Option) (r *item.SearchResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Search(ctx, req)\n}\n\nfunc (p *kItemServiceClient) List(ctx context.Context, req *item.ListReq, callOptions ...callopt.Option) (r *item.ListResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.List(ctx, req)\n}\n\nfunc (p *kItemServiceClient) DecrStock(ctx context.Context, req *item.DecrStockReq, callOptions ...callopt.Option) (r *item.DecrStockResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.DecrStock(ctx, req)\n}\n\nfunc (p *kItemServiceClient) DecrStockRevert(ctx context.Context, req *item.DecrStockReq, callOptions ...callopt.Option) (r *item.DecrStockResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.DecrStockRevert(ctx, req)\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/item/itemservice/invoker.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage itemservice\n\nimport (\n\titem \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler item.ItemService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/item/itemservice/itemservice.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage itemservice\n\nimport (\n\t\"context\"\n\titem \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn itemServiceServiceInfo\n}\n\nvar itemServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"ItemService\"\n\thandlerType := (*item.ItemService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Add\":             kitex.NewMethodInfo(addHandler, newItemServiceAddArgs, newItemServiceAddResult, false),\n\t\t\"Edit\":            kitex.NewMethodInfo(editHandler, newItemServiceEditArgs, newItemServiceEditResult, false),\n\t\t\"Delete\":          kitex.NewMethodInfo(deleteHandler, newItemServiceDeleteArgs, newItemServiceDeleteResult, false),\n\t\t\"Online\":          kitex.NewMethodInfo(onlineHandler, newItemServiceOnlineArgs, newItemServiceOnlineResult, false),\n\t\t\"Offline\":         kitex.NewMethodInfo(offlineHandler, newItemServiceOfflineArgs, newItemServiceOfflineResult, false),\n\t\t\"Get\":             kitex.NewMethodInfo(getHandler, newItemServiceGetArgs, newItemServiceGetResult, false),\n\t\t\"MGet2C\":          kitex.NewMethodInfo(mGet2CHandler, newItemServiceMGet2CArgs, newItemServiceMGet2CResult, false),\n\t\t\"Search\":          kitex.NewMethodInfo(searchHandler, newItemServiceSearchArgs, newItemServiceSearchResult, false),\n\t\t\"List\":            kitex.NewMethodInfo(listHandler, newItemServiceListArgs, newItemServiceListResult, false),\n\t\t\"DecrStock\":       kitex.NewMethodInfo(decrStockHandler, newItemServiceDecrStockArgs, newItemServiceDecrStockResult, false),\n\t\t\"DecrStockRevert\": kitex.NewMethodInfo(decrStockRevertHandler, newItemServiceDecrStockRevertArgs, newItemServiceDecrStockRevertResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"item\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.3\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc addHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceAddArgs)\n\trealResult := result.(*item.ItemServiceAddResult)\n\tsuccess, err := handler.(item.ItemService).Add(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceAddArgs() interface{} {\n\treturn item.NewItemServiceAddArgs()\n}\n\nfunc newItemServiceAddResult() interface{} {\n\treturn item.NewItemServiceAddResult()\n}\n\nfunc editHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceEditArgs)\n\trealResult := result.(*item.ItemServiceEditResult)\n\tsuccess, err := handler.(item.ItemService).Edit(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceEditArgs() interface{} {\n\treturn item.NewItemServiceEditArgs()\n}\n\nfunc newItemServiceEditResult() interface{} {\n\treturn item.NewItemServiceEditResult()\n}\n\nfunc deleteHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceDeleteArgs)\n\trealResult := result.(*item.ItemServiceDeleteResult)\n\tsuccess, err := handler.(item.ItemService).Delete(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceDeleteArgs() interface{} {\n\treturn item.NewItemServiceDeleteArgs()\n}\n\nfunc newItemServiceDeleteResult() interface{} {\n\treturn item.NewItemServiceDeleteResult()\n}\n\nfunc onlineHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceOnlineArgs)\n\trealResult := result.(*item.ItemServiceOnlineResult)\n\tsuccess, err := handler.(item.ItemService).Online(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceOnlineArgs() interface{} {\n\treturn item.NewItemServiceOnlineArgs()\n}\n\nfunc newItemServiceOnlineResult() interface{} {\n\treturn item.NewItemServiceOnlineResult()\n}\n\nfunc offlineHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceOfflineArgs)\n\trealResult := result.(*item.ItemServiceOfflineResult)\n\tsuccess, err := handler.(item.ItemService).Offline(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceOfflineArgs() interface{} {\n\treturn item.NewItemServiceOfflineArgs()\n}\n\nfunc newItemServiceOfflineResult() interface{} {\n\treturn item.NewItemServiceOfflineResult()\n}\n\nfunc getHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceGetArgs)\n\trealResult := result.(*item.ItemServiceGetResult)\n\tsuccess, err := handler.(item.ItemService).Get(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceGetArgs() interface{} {\n\treturn item.NewItemServiceGetArgs()\n}\n\nfunc newItemServiceGetResult() interface{} {\n\treturn item.NewItemServiceGetResult()\n}\n\nfunc mGet2CHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceMGet2CArgs)\n\trealResult := result.(*item.ItemServiceMGet2CResult)\n\tsuccess, err := handler.(item.ItemService).MGet2C(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceMGet2CArgs() interface{} {\n\treturn item.NewItemServiceMGet2CArgs()\n}\n\nfunc newItemServiceMGet2CResult() interface{} {\n\treturn item.NewItemServiceMGet2CResult()\n}\n\nfunc searchHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceSearchArgs)\n\trealResult := result.(*item.ItemServiceSearchResult)\n\tsuccess, err := handler.(item.ItemService).Search(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceSearchArgs() interface{} {\n\treturn item.NewItemServiceSearchArgs()\n}\n\nfunc newItemServiceSearchResult() interface{} {\n\treturn item.NewItemServiceSearchResult()\n}\n\nfunc listHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceListArgs)\n\trealResult := result.(*item.ItemServiceListResult)\n\tsuccess, err := handler.(item.ItemService).List(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceListArgs() interface{} {\n\treturn item.NewItemServiceListArgs()\n}\n\nfunc newItemServiceListResult() interface{} {\n\treturn item.NewItemServiceListResult()\n}\n\nfunc decrStockHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceDecrStockArgs)\n\trealResult := result.(*item.ItemServiceDecrStockResult)\n\tsuccess, err := handler.(item.ItemService).DecrStock(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceDecrStockArgs() interface{} {\n\treturn item.NewItemServiceDecrStockArgs()\n}\n\nfunc newItemServiceDecrStockResult() interface{} {\n\treturn item.NewItemServiceDecrStockResult()\n}\n\nfunc decrStockRevertHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*item.ItemServiceDecrStockRevertArgs)\n\trealResult := result.(*item.ItemServiceDecrStockRevertResult)\n\tsuccess, err := handler.(item.ItemService).DecrStockRevert(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newItemServiceDecrStockRevertArgs() interface{} {\n\treturn item.NewItemServiceDecrStockRevertArgs()\n}\n\nfunc newItemServiceDecrStockRevertResult() interface{} {\n\treturn item.NewItemServiceDecrStockRevertResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Add(ctx context.Context, req *item.AddReq) (r *item.AddResp, err error) {\n\tvar _args item.ItemServiceAddArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceAddResult\n\tif err = p.c.Call(ctx, \"Add\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Edit(ctx context.Context, req *item.EditReq) (r *item.EditResp, err error) {\n\tvar _args item.ItemServiceEditArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceEditResult\n\tif err = p.c.Call(ctx, \"Edit\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Delete(ctx context.Context, req *item.DeleteReq) (r *item.DeleteResp, err error) {\n\tvar _args item.ItemServiceDeleteArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceDeleteResult\n\tif err = p.c.Call(ctx, \"Delete\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Online(ctx context.Context, req *item.OnlineReq) (r *item.OnlineResp, err error) {\n\tvar _args item.ItemServiceOnlineArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceOnlineResult\n\tif err = p.c.Call(ctx, \"Online\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Offline(ctx context.Context, req *item.OfflineReq) (r *item.OfflineResp, err error) {\n\tvar _args item.ItemServiceOfflineArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceOfflineResult\n\tif err = p.c.Call(ctx, \"Offline\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Get(ctx context.Context, req *item.GetReq) (r *item.GetResp, err error) {\n\tvar _args item.ItemServiceGetArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceGetResult\n\tif err = p.c.Call(ctx, \"Get\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) MGet2C(ctx context.Context, req *item.MGet2CReq) (r *item.MGet2CResp, err error) {\n\tvar _args item.ItemServiceMGet2CArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceMGet2CResult\n\tif err = p.c.Call(ctx, \"MGet2C\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Search(ctx context.Context, req *item.SearchReq) (r *item.SearchResp, err error) {\n\tvar _args item.ItemServiceSearchArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceSearchResult\n\tif err = p.c.Call(ctx, \"Search\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) List(ctx context.Context, req *item.ListReq) (r *item.ListResp, err error) {\n\tvar _args item.ItemServiceListArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceListResult\n\tif err = p.c.Call(ctx, \"List\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) DecrStock(ctx context.Context, req *item.DecrStockReq) (r *item.DecrStockResp, err error) {\n\tvar _args item.ItemServiceDecrStockArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceDecrStockResult\n\tif err = p.c.Call(ctx, \"DecrStock\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) DecrStockRevert(ctx context.Context, req *item.DecrStockReq) (r *item.DecrStockResp, err error) {\n\tvar _args item.ItemServiceDecrStockRevertArgs\n\t_args.Req = req\n\tvar _result item.ItemServiceDecrStockRevertResult\n\tif err = p.c.Call(ctx, \"DecrStockRevert\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/item/itemservice/server.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\npackage itemservice\n\nimport (\n\titem \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/item\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler item.ItemService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/item/k-consts.go",
    "content": "package item\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/item/k-item.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage item\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/base\"\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n\t_ = base.KitexUnusedProtection\n)\n\nfunc (p *BookProperty) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BookProperty[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BookProperty) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Isbn = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BookProperty) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.SpuName = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BookProperty) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.SpuPrice = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *BookProperty) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *BookProperty) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"BookProperty\")\n\tif p != nil {\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BookProperty) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"BookProperty\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *BookProperty) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"isbn\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Isbn)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BookProperty) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"spu_name\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.SpuName)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BookProperty) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"spu_price\", thrift.I64, 3)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.SpuPrice)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BookProperty) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"isbn\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Isbn)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BookProperty) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"spu_name\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.SpuName)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BookProperty) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"spu_price\", thrift.I64, 3)\n\tl += bthrift.Binary.I64Length(p.SpuPrice)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField6(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField7(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 8:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tl, err = p.FastReadField8(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Product[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Product) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Name = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Pic = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Description = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBookProperty()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Property = tmp\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField6(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Price = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField7(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Stock = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField8(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI32(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Status = Status(v)\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Product) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Product) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Product\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField6(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField7(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField8(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Product\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t\tl += p.field6Length()\n\t\tl += p.field7Length()\n\t\tl += p.field8Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Product) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"name\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Name)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"pic\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Pic)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"description\", thrift.STRING, 4)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Description)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"property\", thrift.STRUCT, 5)\n\toffset += p.Property.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField6(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"price\", thrift.I64, 6)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.Price)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField7(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"stock\", thrift.I64, 7)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.Stock)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField8(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"status\", thrift.I32, 8)\n\toffset += bthrift.Binary.WriteI32(buf[offset:], int32(p.Status))\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"name\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Name)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"pic\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.Pic)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"description\", thrift.STRING, 4)\n\tl += bthrift.Binary.StringLengthNocopy(p.Description)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field5Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"property\", thrift.STRUCT, 5)\n\tl += p.Property.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field6Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"price\", thrift.I64, 6)\n\tl += bthrift.Binary.I64Length(p.Price)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field7Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"stock\", thrift.I64, 7)\n\tl += bthrift.Binary.I64Length(p.Stock)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field8Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"status\", thrift.I32, 8)\n\tl += bthrift.Binary.I32Length(int32(p.Status))\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *AddReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetName bool = false\n\tvar issetPic bool = false\n\tvar issetDescription bool = false\n\tvar issetProperty bool = false\n\tvar issetPrice bool = false\n\tvar issetStock bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetName = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetPic = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetDescription = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProperty = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetPrice = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField6(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetStock = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetName {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetPic {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetDescription {\n\t\tfieldId = 3\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetProperty {\n\t\tfieldId = 4\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetPrice {\n\t\tfieldId = 5\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetStock {\n\t\tfieldId = 6\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_AddReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_AddReq[fieldId]))\n}\n\nfunc (p *AddReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Name = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *AddReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Pic = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *AddReq) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Description = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *AddReq) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBookProperty()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Property = tmp\n\treturn offset, nil\n}\n\nfunc (p *AddReq) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Price = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *AddReq) FastReadField6(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Stock = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *AddReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *AddReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"AddReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField6(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"AddReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t\tl += p.field6Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *AddReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"name\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Name)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"pic\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Pic)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddReq) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"description\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Description)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddReq) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"property\", thrift.STRUCT, 4)\n\toffset += p.Property.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddReq) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"price\", thrift.I64, 5)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.Price)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddReq) fastWriteField6(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"stock\", thrift.I64, 6)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.Stock)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"name\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Name)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *AddReq) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"pic\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Pic)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *AddReq) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"description\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.Description)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *AddReq) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"property\", thrift.STRUCT, 4)\n\tl += p.Property.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *AddReq) field5Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"price\", thrift.I64, 5)\n\tl += bthrift.Binary.I64Length(p.Price)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *AddReq) field6Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"stock\", thrift.I64, 6)\n\tl += bthrift.Binary.I64Length(p.Stock)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *AddResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_AddResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *AddResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *AddResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *AddResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *AddResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"AddResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"AddResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *AddResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *AddResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *AddResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EditReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField6(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField7(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EditReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_EditReq[fieldId]))\n}\n\nfunc (p *EditReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *EditReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Name = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *EditReq) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Pic = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *EditReq) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Description = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *EditReq) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBookProperty()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Property = tmp\n\treturn offset, nil\n}\n\nfunc (p *EditReq) FastReadField6(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Price = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *EditReq) FastReadField7(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Stock = &v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EditReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EditReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"EditReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField6(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField7(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EditReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"EditReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t\tl += p.field6Length()\n\t\tl += p.field7Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EditReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EditReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetName() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"name\", thrift.STRING, 2)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.Name)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EditReq) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetPic() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"pic\", thrift.STRING, 3)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.Pic)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EditReq) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetDescription() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"description\", thrift.STRING, 4)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.Description)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EditReq) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetProperty() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"property\", thrift.STRUCT, 5)\n\t\toffset += p.Property.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EditReq) fastWriteField6(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetPrice() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"price\", thrift.I64, 6)\n\t\toffset += bthrift.Binary.WriteI64(buf[offset:], *p.Price)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EditReq) fastWriteField7(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetStock() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"stock\", thrift.I64, 7)\n\t\toffset += bthrift.Binary.WriteI64(buf[offset:], *p.Stock)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EditReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EditReq) field2Length() int {\n\tl := 0\n\tif p.IsSetName() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"name\", thrift.STRING, 2)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.Name)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EditReq) field3Length() int {\n\tl := 0\n\tif p.IsSetPic() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"pic\", thrift.STRING, 3)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.Pic)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EditReq) field4Length() int {\n\tl := 0\n\tif p.IsSetDescription() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"description\", thrift.STRING, 4)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.Description)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EditReq) field5Length() int {\n\tl := 0\n\tif p.IsSetProperty() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"property\", thrift.STRUCT, 5)\n\t\tl += p.Property.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EditReq) field6Length() int {\n\tl := 0\n\tif p.IsSetPrice() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"price\", thrift.I64, 6)\n\t\tl += bthrift.Binary.I64Length(*p.Price)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EditReq) field7Length() int {\n\tl := 0\n\tif p.IsSetStock() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"stock\", thrift.I64, 7)\n\t\tl += bthrift.Binary.I64Length(*p.Stock)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EditResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EditResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EditResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EditResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EditResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"EditResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EditResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"EditResp\")\n\tif p != nil {\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EditResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EditResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DeleteReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_DeleteReq[fieldId]))\n}\n\nfunc (p *DeleteReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *DeleteReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *DeleteReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DeleteReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DeleteReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DeleteReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *DeleteReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DeleteReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DeleteResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DeleteResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *DeleteResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *DeleteResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DeleteResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DeleteResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DeleteResp\")\n\tif p != nil {\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *DeleteResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DeleteResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OnlineReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OnlineReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_OnlineReq[fieldId]))\n}\n\nfunc (p *OnlineReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OnlineReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OnlineReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"OnlineReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OnlineReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"OnlineReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OnlineReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OnlineReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OnlineResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OnlineResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OnlineResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OnlineResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OnlineResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"OnlineResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OnlineResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"OnlineResp\")\n\tif p != nil {\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OnlineResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OnlineResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OfflineReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OfflineReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_OfflineReq[fieldId]))\n}\n\nfunc (p *OfflineReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OfflineReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OfflineReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"OfflineReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OfflineReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"OfflineReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OfflineReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OfflineReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OfflineResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OfflineResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OfflineResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OfflineResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OfflineResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"OfflineResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OfflineResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"OfflineResp\")\n\tif p != nil {\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OfflineResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OfflineResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetReq[fieldId]))\n}\n\nfunc (p *GetReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *GetReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *GetReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *GetReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *GetResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewProduct()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Product = tmp\n\treturn offset, nil\n}\n\nfunc (p *GetResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *GetResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *GetResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *GetResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product\", thrift.STRUCT, 1)\n\toffset += p.Product.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product\", thrift.STRUCT, 1)\n\tl += p.Product.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGet2CReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductIds bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductIds = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductIds {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGet2CReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_MGet2CReq[fieldId]))\n}\n\nfunc (p *MGet2CReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.ProductIds = make([]int64, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _elem int64\n\t\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\n\t\t\t_elem = v\n\n\t\t}\n\n\t\tp.ProductIds = append(p.ProductIds, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *MGet2CReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *MGet2CReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGet2CReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGet2CReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGet2CReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *MGet2CReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_ids\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.I64, 0)\n\tvar length int\n\tfor _, v := range p.ProductIds {\n\t\tlength++\n\t\toffset += bthrift.Binary.WriteI64(buf[offset:], v)\n\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.I64, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGet2CReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_ids\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.I64, len(p.ProductIds))\n\tvar tmpV int64\n\tl += bthrift.Binary.I64Length(int64(tmpV)) * len(p.ProductIds)\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGet2CResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.MAP {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGet2CResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGet2CResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, _, size, l, err := bthrift.Binary.ReadMapBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.ProductMap = make(map[int64]*Product, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _key int64\n\t\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\n\t\t\t_key = v\n\n\t\t}\n\t\t_val := NewProduct()\n\t\tif l, err := _val.FastRead(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\t\t}\n\n\t\tp.ProductMap[_key] = _val\n\t}\n\tif l, err := bthrift.Binary.ReadMapEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\nfunc (p *MGet2CResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *MGet2CResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *MGet2CResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGet2CResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGet2CResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGet2CResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *MGet2CResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_map\", thrift.MAP, 1)\n\tmapBeginOffset := offset\n\toffset += bthrift.Binary.MapBeginLength(thrift.I64, thrift.STRUCT, 0)\n\tvar length int\n\tfor k, v := range p.ProductMap {\n\t\tlength++\n\n\t\toffset += bthrift.Binary.WriteI64(buf[offset:], k)\n\n\t\toffset += v.FastWriteNocopy(buf[offset:], binaryWriter)\n\t}\n\tbthrift.Binary.WriteMapBegin(buf[mapBeginOffset:], thrift.I64, thrift.STRUCT, length)\n\toffset += bthrift.Binary.WriteMapEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGet2CResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGet2CResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_map\", thrift.MAP, 1)\n\tl += bthrift.Binary.MapBeginLength(thrift.I64, thrift.STRUCT, len(p.ProductMap))\n\tfor k, v := range p.ProductMap {\n\n\t\tl += bthrift.Binary.I64Length(k)\n\n\t\tl += v.BLength()\n\t}\n\tl += bthrift.Binary.MapEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGet2CResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *SearchReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_SearchReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *SearchReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Name = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *SearchReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Description = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *SearchReq) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.SpuName = &v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *SearchReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *SearchReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"SearchReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *SearchReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"SearchReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *SearchReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetName() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"name\", thrift.STRING, 1)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.Name)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *SearchReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetDescription() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"description\", thrift.STRING, 2)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.Description)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *SearchReq) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSpuName() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"spu_name\", thrift.STRING, 3)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.SpuName)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *SearchReq) field1Length() int {\n\tl := 0\n\tif p.IsSetName() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"name\", thrift.STRING, 1)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.Name)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *SearchReq) field2Length() int {\n\tl := 0\n\tif p.IsSetDescription() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"description\", thrift.STRING, 2)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.Description)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *SearchReq) field3Length() int {\n\tl := 0\n\tif p.IsSetSpuName() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"spu_name\", thrift.STRING, 3)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.SpuName)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *SearchResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_SearchResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *SearchResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Products = make([]*Product, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewProduct()\n\t\tif l, err := _elem.FastRead(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\t\t}\n\n\t\tp.Products = append(p.Products, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\nfunc (p *SearchResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *SearchResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *SearchResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"SearchResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *SearchResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"SearchResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *SearchResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"products\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.STRUCT, 0)\n\tvar length int\n\tfor _, v := range p.Products {\n\t\tlength++\n\t\toffset += v.FastWriteNocopy(buf[offset:], binaryWriter)\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.STRUCT, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *SearchResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *SearchResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"products\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.STRUCT, len(p.Products))\n\tfor _, v := range p.Products {\n\t\tl += v.BLength()\n\t}\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *SearchResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ListReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ListReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Name = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *ListReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.SpuName = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *ListReq) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI32(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\ttmp := Status(v)\n\t\tp.Status = &tmp\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ListReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ListReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ListReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetName() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"name\", thrift.STRING, 1)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.Name)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ListReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSpuName() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"spu_name\", thrift.STRING, 2)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.SpuName)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ListReq) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetStatus() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"status\", thrift.I32, 3)\n\t\toffset += bthrift.Binary.WriteI32(buf[offset:], int32(*p.Status))\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ListReq) field1Length() int {\n\tl := 0\n\tif p.IsSetName() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"name\", thrift.STRING, 1)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.Name)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ListReq) field2Length() int {\n\tl := 0\n\tif p.IsSetSpuName() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"spu_name\", thrift.STRING, 2)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.SpuName)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ListReq) field3Length() int {\n\tl := 0\n\tif p.IsSetStatus() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"status\", thrift.I32, 3)\n\t\tl += bthrift.Binary.I32Length(int32(*p.Status))\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ListResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ListResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Products = make([]*Product, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewProduct()\n\t\tif l, err := _elem.FastRead(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\t\t}\n\n\t\tp.Products = append(p.Products, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\nfunc (p *ListResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ListResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ListResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ListResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"products\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.STRUCT, 0)\n\tvar length int\n\tfor _, v := range p.Products {\n\t\tlength++\n\t\toffset += v.FastWriteNocopy(buf[offset:], binaryWriter)\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.STRUCT, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"products\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.STRUCT, len(p.Products))\n\tfor _, v := range p.Products {\n\t\tl += v.BLength()\n\t}\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ListResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DecrStockReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductId bool = false\n\tvar issetStockNum bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetStockNum = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetStockNum {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DecrStockReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_DecrStockReq[fieldId]))\n}\n\nfunc (p *DecrStockReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *DecrStockReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StockNum = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *DecrStockReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *DecrStockReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DecrStockReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DecrStockReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DecrStockReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *DecrStockReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DecrStockReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"stock_num\", thrift.I64, 2)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.StockNum)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DecrStockReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DecrStockReq) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"stock_num\", thrift.I64, 2)\n\tl += bthrift.Binary.I64Length(p.StockNum)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DecrStockResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DecrStockResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DecrStockResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *DecrStockResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *DecrStockResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DecrStockResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DecrStockResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DecrStockResp\")\n\tif p != nil {\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *DecrStockResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DecrStockResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceAddArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceAddArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceAddArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewAddReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceAddArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceAddArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Add_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceAddArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Add_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceAddArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceAddArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceAddResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceAddResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceAddResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewAddResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceAddResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceAddResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Add_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceAddResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Add_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceAddResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceAddResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceEditArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceEditArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceEditArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewEditReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceEditArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceEditArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Edit_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceEditArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Edit_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceEditArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceEditArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceEditResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceEditResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceEditResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewEditResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceEditResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceEditResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Edit_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceEditResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Edit_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceEditResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceEditResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceDeleteArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDeleteArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDeleteArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewDeleteReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceDeleteArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceDeleteArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Delete_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceDeleteArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Delete_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceDeleteArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceDeleteArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceDeleteResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDeleteResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDeleteResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewDeleteResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceDeleteResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceDeleteResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Delete_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceDeleteResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Delete_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceDeleteResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceDeleteResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceOnlineArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceOnlineArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOnlineArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewOnlineReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceOnlineArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceOnlineArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Online_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceOnlineArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Online_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceOnlineArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceOnlineArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceOnlineResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceOnlineResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOnlineResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewOnlineResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceOnlineResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceOnlineResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Online_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceOnlineResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Online_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceOnlineResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceOnlineResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceOfflineArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceOfflineArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOfflineArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewOfflineReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceOfflineArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceOfflineArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Offline_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceOfflineArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Offline_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceOfflineArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceOfflineArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceOfflineResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceOfflineResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceOfflineResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewOfflineResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceOfflineResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceOfflineResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Offline_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceOfflineResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Offline_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceOfflineResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceOfflineResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceGetArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceGetArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceGetArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewGetReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceGetArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceGetArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Get_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceGetArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Get_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceGetArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceGetArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceGetResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceGetResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceGetResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewGetResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceGetResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceGetResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Get_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceGetResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Get_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceGetResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceGetResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceMGet2CArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceMGet2CArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceMGet2CArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewMGet2CReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceMGet2CArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceMGet2CArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGet2C_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceMGet2CArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGet2C_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceMGet2CArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceMGet2CArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceMGet2CResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceMGet2CResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceMGet2CResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewMGet2CResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceMGet2CResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceMGet2CResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGet2C_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceMGet2CResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGet2C_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceMGet2CResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceMGet2CResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceSearchArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceSearchArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceSearchArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewSearchReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceSearchArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceSearchArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Search_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceSearchArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Search_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceSearchArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceSearchArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceSearchResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceSearchResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceSearchResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewSearchResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceSearchResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceSearchResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Search_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceSearchResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Search_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceSearchResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceSearchResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceListArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceListArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceListArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewListReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceListArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceListArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"List_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceListArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"List_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceListArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceListArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceListResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceListResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceListResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewListResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceListResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceListResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"List_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceListResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"List_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceListResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceListResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceDecrStockArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDecrStockArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewDecrStockReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceDecrStockArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceDecrStockArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DecrStock_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceDecrStockArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DecrStock_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceDecrStockArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceDecrStockArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceDecrStockResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDecrStockResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewDecrStockResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceDecrStockResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceDecrStockResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DecrStock_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceDecrStockResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DecrStock_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceDecrStockResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceDecrStockResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDecrStockRevertArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewDecrStockReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceDecrStockRevertArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DecrStockRevert_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DecrStockRevert_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ItemServiceDecrStockRevertResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewDecrStockResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ItemServiceDecrStockRevertResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DecrStockRevert_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DecrStockRevert_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ItemServiceAddArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceAddResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceEditArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceEditResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceDeleteArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceDeleteResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceOnlineArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceOnlineResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceOfflineArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceOfflineResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceGetArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceGetResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceMGet2CArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceMGet2CResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceSearchArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceSearchResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceListArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceListResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceDecrStockArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceDecrStockResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ItemServiceDecrStockRevertArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ItemServiceDecrStockRevertResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/order/k-consts.go",
    "content": "package order\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/order/k-order.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage order\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/base\"\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n\t_ = base.KitexUnusedProtection\n)\n\nfunc (p *OrderItem) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField6(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField7(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 8:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tl, err = p.FastReadField8(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 9:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField9(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 10:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField10(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderItem[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderItem) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OrderId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *OrderItem) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *OrderItem) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserName = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *OrderItem) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Address = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *OrderItem) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *OrderItem) FastReadField6(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StockNum = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *OrderItem) FastReadField7(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductSnapshot = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *OrderItem) FastReadField8(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI32(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Status = Status(v)\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *OrderItem) FastReadField9(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.CreateTime = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *OrderItem) FastReadField10(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UpdateTime = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OrderItem) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OrderItem) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"OrderItem\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField6(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField9(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField10(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField7(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField8(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"OrderItem\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t\tl += p.field6Length()\n\t\tl += p.field7Length()\n\t\tl += p.field8Length()\n\t\tl += p.field9Length()\n\t\tl += p.field10Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"order_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.OrderId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 2)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_name\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.UserName)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"address\", thrift.STRING, 4)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Address)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 5)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) fastWriteField6(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"stock_num\", thrift.I64, 6)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.StockNum)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) fastWriteField7(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_snapshot\", thrift.STRING, 7)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.ProductSnapshot)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) fastWriteField8(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"status\", thrift.I32, 8)\n\toffset += bthrift.Binary.WriteI32(buf[offset:], int32(p.Status))\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) fastWriteField9(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"create_time\", thrift.I64, 9)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.CreateTime)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) fastWriteField10(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"update_time\", thrift.I64, 10)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UpdateTime)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderItem) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"order_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.OrderId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 2)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_name\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.UserName)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"address\", thrift.STRING, 4)\n\tl += bthrift.Binary.StringLengthNocopy(p.Address)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) field5Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 5)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) field6Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"stock_num\", thrift.I64, 6)\n\tl += bthrift.Binary.I64Length(p.StockNum)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) field7Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_snapshot\", thrift.STRING, 7)\n\tl += bthrift.Binary.StringLengthNocopy(p.ProductSnapshot)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) field8Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"status\", thrift.I32, 8)\n\tl += bthrift.Binary.I32Length(int32(p.Status))\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) field9Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"create_time\", thrift.I64, 9)\n\tl += bthrift.Binary.I64Length(p.CreateTime)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderItem) field10Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"update_time\", thrift.I64, 10)\n\tl += bthrift.Binary.I64Length(p.UpdateTime)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateOrderReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetUserId bool = false\n\tvar issetAddress bool = false\n\tvar issetProductId bool = false\n\tvar issetStockNum bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetUserId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetAddress = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetStockNum = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetUserId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetAddress {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 3\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetStockNum {\n\t\tfieldId = 4\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_CreateOrderReq[fieldId]))\n}\n\nfunc (p *CreateOrderReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CreateOrderReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Address = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CreateOrderReq) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CreateOrderReq) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StockNum = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CreateOrderReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CreateOrderReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateOrderReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateOrderReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateOrderReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CreateOrderReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateOrderReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"address\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Address)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateOrderReq) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"product_id\", thrift.I64, 3)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ProductId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateOrderReq) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"stock_num\", thrift.I64, 4)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.StockNum)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateOrderReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateOrderReq) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"address\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Address)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateOrderReq) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"product_id\", thrift.I64, 3)\n\tl += bthrift.Binary.I64Length(p.ProductId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateOrderReq) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"stock_num\", thrift.I64, 4)\n\tl += bthrift.Binary.I64Length(p.StockNum)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateOrderResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateOrderResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateOrderResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CreateOrderResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CreateOrderResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateOrderResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateOrderResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateOrderResp\")\n\tif p != nil {\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CreateOrderResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateOrderResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CancelOrderReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetOrderId bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetOrderId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetOrderId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CancelOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_CancelOrderReq[fieldId]))\n}\n\nfunc (p *CancelOrderReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OrderId = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CancelOrderReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CancelOrderReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CancelOrderReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CancelOrderReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CancelOrderReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CancelOrderReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"order_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.OrderId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CancelOrderReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"order_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.OrderId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CancelOrderResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CancelOrderResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CancelOrderResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CancelOrderResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CancelOrderResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CancelOrderResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CancelOrderResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CancelOrderResp\")\n\tif p != nil {\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CancelOrderResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CancelOrderResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ListOrderReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetUserId bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetUserId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetUserId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_ListOrderReq[fieldId]))\n}\n\nfunc (p *ListOrderReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *ListOrderReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI32(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\ttmp := Status(v)\n\t\tp.Status = &tmp\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ListOrderReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ListOrderReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListOrderReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListOrderReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListOrderReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ListOrderReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListOrderReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetStatus() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"status\", thrift.I32, 2)\n\t\toffset += bthrift.Binary.WriteI32(buf[offset:], int32(*p.Status))\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ListOrderReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ListOrderReq) field2Length() int {\n\tl := 0\n\tif p.IsSetStatus() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"status\", thrift.I32, 2)\n\t\tl += bthrift.Binary.I32Length(int32(*p.Status))\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ListOrderResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListOrderResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ListOrderResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Orders = make([]*OrderItem, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewOrderItem()\n\t\tif l, err := _elem.FastRead(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\t\t}\n\n\t\tp.Orders = append(p.Orders, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\nfunc (p *ListOrderResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ListOrderResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ListOrderResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListOrderResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListOrderResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListOrderResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ListOrderResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"orders\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.STRUCT, 0)\n\tvar length int\n\tfor _, v := range p.Orders {\n\t\tlength++\n\t\toffset += v.FastWriteNocopy(buf[offset:], binaryWriter)\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.STRUCT, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListOrderResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListOrderResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"orders\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.STRUCT, len(p.Orders))\n\tfor _, v := range p.Orders {\n\t\tl += v.BLength()\n\t}\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ListOrderResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetOrderByIdReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetOrderId bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetOrderId = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetOrderId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetOrderByIdReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetOrderByIdReq[fieldId]))\n}\n\nfunc (p *GetOrderByIdReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OrderId = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *GetOrderByIdReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *GetOrderByIdReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetOrderByIdReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetOrderByIdReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetOrderByIdReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *GetOrderByIdReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"order_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.OrderId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetOrderByIdReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"order_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.OrderId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetOrderByIdResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetOrderByIdResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *GetOrderByIdResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewOrderItem()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Order = tmp\n\treturn offset, nil\n}\n\nfunc (p *GetOrderByIdResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *GetOrderByIdResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *GetOrderByIdResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetOrderByIdResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetOrderByIdResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetOrderByIdResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *GetOrderByIdResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"order\", thrift.STRUCT, 1)\n\toffset += p.Order.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetOrderByIdResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetOrderByIdResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"order\", thrift.STRUCT, 1)\n\tl += p.Order.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetOrderByIdResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceCreateOrderArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceCreateOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCreateOrderArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCreateOrderReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OrderServiceCreateOrderArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OrderServiceCreateOrderArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateOrder_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceCreateOrderArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateOrder_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceCreateOrderArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceCreateOrderArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceCreateOrderResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceCreateOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCreateOrderResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCreateOrderResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OrderServiceCreateOrderResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OrderServiceCreateOrderResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateOrder_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceCreateOrderResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateOrder_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceCreateOrderResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *OrderServiceCreateOrderResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *OrderServiceCancelOrderArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceCancelOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCancelOrderArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCancelOrderReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OrderServiceCancelOrderArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OrderServiceCancelOrderArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CancelOrder_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceCancelOrderArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CancelOrder_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceCancelOrderArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceCancelOrderArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceCancelOrderResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceCancelOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCancelOrderResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCancelOrderResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OrderServiceCancelOrderResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OrderServiceCancelOrderResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CancelOrder_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceCancelOrderResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CancelOrder_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceCancelOrderResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *OrderServiceCancelOrderResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *OrderServiceListOrderArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceListOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceListOrderArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewListOrderReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OrderServiceListOrderArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OrderServiceListOrderArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListOrder_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceListOrderArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListOrder_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceListOrderArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceListOrderArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceListOrderResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceListOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceListOrderResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewListOrderResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OrderServiceListOrderResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OrderServiceListOrderResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListOrder_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceListOrderResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListOrder_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceListOrderResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *OrderServiceListOrderResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceGetOrderByIdArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewGetOrderByIdReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OrderServiceGetOrderByIdArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetOrderById_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetOrderById_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceGetOrderByIdResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewGetOrderByIdResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *OrderServiceGetOrderByIdResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetOrderById_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetOrderById_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *OrderServiceCreateOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *OrderServiceCreateOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *OrderServiceCancelOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *OrderServiceCancelOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *OrderServiceListOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *OrderServiceListOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/order/order.go",
    "content": "// Code generated by thriftgo (0.1.7). DO NOT EDIT.\n\npackage order\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"database/sql/driver\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/base\"\n\t\"strings\"\n)\n\ntype Status int64\n\nconst (\n\tStatus_Finish  Status = 0\n\tStatus_Cancel  Status = 1\n\tStatus_Pending Status = 2\n)\n\nfunc (p Status) String() string {\n\tswitch p {\n\tcase Status_Finish:\n\t\treturn \"Finish\"\n\tcase Status_Cancel:\n\t\treturn \"Cancel\"\n\tcase Status_Pending:\n\t\treturn \"Pending\"\n\t}\n\treturn \"<UNSET>\"\n}\n\nfunc StatusFromString(s string) (Status, error) {\n\tswitch s {\n\tcase \"Finish\":\n\t\treturn Status_Finish, nil\n\tcase \"Cancel\":\n\t\treturn Status_Cancel, nil\n\tcase \"Pending\":\n\t\treturn Status_Pending, nil\n\t}\n\treturn Status(0), fmt.Errorf(\"not a valid Status string\")\n}\n\nfunc StatusPtr(v Status) *Status { return &v }\n\nfunc (p *Status) Scan(value interface{}) (err error) {\n\tvar result sql.NullInt64\n\terr = result.Scan(value)\n\t*p = Status(result.Int64)\n\treturn\n}\n\nfunc (p *Status) Value() (driver.Value, error) {\n\tif p == nil {\n\t\treturn nil, nil\n\t}\n\treturn int64(*p), nil\n}\n\ntype OrderItem struct {\n\tOrderId         int64  `thrift:\"order_id,1\" json:\"order_id\"`\n\tUserId          int64  `thrift:\"user_id,2\" json:\"user_id\"`\n\tUserName        string `thrift:\"user_name,3\" json:\"user_name\"`\n\tAddress         string `thrift:\"address,4\" json:\"address\"`\n\tProductId       int64  `thrift:\"product_id,5\" json:\"product_id\"`\n\tStockNum        int64  `thrift:\"stock_num,6\" json:\"stock_num\"`\n\tProductSnapshot string `thrift:\"product_snapshot,7\" json:\"product_snapshot\"`\n\tStatus          Status `thrift:\"status,8\" json:\"status\"`\n\tCreateTime      int64  `thrift:\"create_time,9\" json:\"create_time\"`\n\tUpdateTime      int64  `thrift:\"update_time,10\" json:\"update_time\"`\n}\n\nfunc NewOrderItem() *OrderItem {\n\treturn &OrderItem{}\n}\n\nfunc (p *OrderItem) GetOrderId() (v int64) {\n\treturn p.OrderId\n}\n\nfunc (p *OrderItem) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nfunc (p *OrderItem) GetUserName() (v string) {\n\treturn p.UserName\n}\n\nfunc (p *OrderItem) GetAddress() (v string) {\n\treturn p.Address\n}\n\nfunc (p *OrderItem) GetProductId() (v int64) {\n\treturn p.ProductId\n}\n\nfunc (p *OrderItem) GetStockNum() (v int64) {\n\treturn p.StockNum\n}\n\nfunc (p *OrderItem) GetProductSnapshot() (v string) {\n\treturn p.ProductSnapshot\n}\n\nfunc (p *OrderItem) GetStatus() (v Status) {\n\treturn p.Status\n}\n\nfunc (p *OrderItem) GetCreateTime() (v int64) {\n\treturn p.CreateTime\n}\n\nfunc (p *OrderItem) GetUpdateTime() (v int64) {\n\treturn p.UpdateTime\n}\nfunc (p *OrderItem) SetOrderId(val int64) {\n\tp.OrderId = val\n}\nfunc (p *OrderItem) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *OrderItem) SetUserName(val string) {\n\tp.UserName = val\n}\nfunc (p *OrderItem) SetAddress(val string) {\n\tp.Address = val\n}\nfunc (p *OrderItem) SetProductId(val int64) {\n\tp.ProductId = val\n}\nfunc (p *OrderItem) SetStockNum(val int64) {\n\tp.StockNum = val\n}\nfunc (p *OrderItem) SetProductSnapshot(val string) {\n\tp.ProductSnapshot = val\n}\nfunc (p *OrderItem) SetStatus(val Status) {\n\tp.Status = val\n}\nfunc (p *OrderItem) SetCreateTime(val int64) {\n\tp.CreateTime = val\n}\nfunc (p *OrderItem) SetUpdateTime(val int64) {\n\tp.UpdateTime = val\n}\n\nvar fieldIDToName_OrderItem = map[int16]string{\n\t1:  \"order_id\",\n\t2:  \"user_id\",\n\t3:  \"user_name\",\n\t4:  \"address\",\n\t5:  \"product_id\",\n\t6:  \"stock_num\",\n\t7:  \"product_snapshot\",\n\t8:  \"status\",\n\t9:  \"create_time\",\n\t10: \"update_time\",\n}\n\nfunc (p *OrderItem) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField6(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField7(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 8:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tif err = p.ReadField8(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 9:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField9(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 10:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField10(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderItem[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderItem) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OrderId = v\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserName = v\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Address = v\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) ReadField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) ReadField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StockNum = v\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) ReadField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductSnapshot = v\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) ReadField8(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Status = Status(v)\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) ReadField9(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.CreateTime = v\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) ReadField10(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UpdateTime = v\n\t}\n\treturn nil\n}\n\nfunc (p *OrderItem) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"OrderItem\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField6(oprot); err != nil {\n\t\t\tfieldId = 6\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField7(oprot); err != nil {\n\t\t\tfieldId = 7\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField8(oprot); err != nil {\n\t\t\tfieldId = 8\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField9(oprot); err != nil {\n\t\t\tfieldId = 9\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField10(oprot); err != nil {\n\t\t\tfieldId = 10\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"order_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.OrderId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_name\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.UserName); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"address\", thrift.STRING, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Address); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField6(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"stock_num\", thrift.I64, 6); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.StockNum); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField7(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_snapshot\", thrift.STRING, 7); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.ProductSnapshot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField8(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"status\", thrift.I32, 8); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI32(int32(p.Status)); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 8 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 8 end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField9(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"create_time\", thrift.I64, 9); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.CreateTime); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 9 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 9 end error: \", p), err)\n}\n\nfunc (p *OrderItem) writeField10(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"update_time\", thrift.I64, 10); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UpdateTime); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 10 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 10 end error: \", p), err)\n}\n\nfunc (p *OrderItem) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OrderItem(%+v)\", *p)\n}\n\nfunc (p *OrderItem) DeepEqual(ano *OrderItem) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.OrderId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.UserName) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.Address) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\tif !p.Field6DeepEqual(ano.StockNum) {\n\t\treturn false\n\t}\n\tif !p.Field7DeepEqual(ano.ProductSnapshot) {\n\t\treturn false\n\t}\n\tif !p.Field8DeepEqual(ano.Status) {\n\t\treturn false\n\t}\n\tif !p.Field9DeepEqual(ano.CreateTime) {\n\t\treturn false\n\t}\n\tif !p.Field10DeepEqual(ano.UpdateTime) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OrderItem) Field1DeepEqual(src int64) bool {\n\n\tif p.OrderId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *OrderItem) Field2DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *OrderItem) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.UserName, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *OrderItem) Field4DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Address, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *OrderItem) Field5DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *OrderItem) Field6DeepEqual(src int64) bool {\n\n\tif p.StockNum != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *OrderItem) Field7DeepEqual(src string) bool {\n\n\tif strings.Compare(p.ProductSnapshot, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *OrderItem) Field8DeepEqual(src Status) bool {\n\n\tif p.Status != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *OrderItem) Field9DeepEqual(src int64) bool {\n\n\tif p.CreateTime != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *OrderItem) Field10DeepEqual(src int64) bool {\n\n\tif p.UpdateTime != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CreateOrderReq struct {\n\tUserId    int64  `thrift:\"user_id,1,required\" json:\"user_id\"`\n\tAddress   string `thrift:\"address,2,required\" json:\"address\"`\n\tProductId int64  `thrift:\"product_id,3,required\" json:\"product_id\"`\n\tStockNum  int64  `thrift:\"stock_num,4,required\" json:\"stock_num\"`\n}\n\nfunc NewCreateOrderReq() *CreateOrderReq {\n\treturn &CreateOrderReq{}\n}\n\nfunc (p *CreateOrderReq) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nfunc (p *CreateOrderReq) GetAddress() (v string) {\n\treturn p.Address\n}\n\nfunc (p *CreateOrderReq) GetProductId() (v int64) {\n\treturn p.ProductId\n}\n\nfunc (p *CreateOrderReq) GetStockNum() (v int64) {\n\treturn p.StockNum\n}\nfunc (p *CreateOrderReq) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *CreateOrderReq) SetAddress(val string) {\n\tp.Address = val\n}\nfunc (p *CreateOrderReq) SetProductId(val int64) {\n\tp.ProductId = val\n}\nfunc (p *CreateOrderReq) SetStockNum(val int64) {\n\tp.StockNum = val\n}\n\nvar fieldIDToName_CreateOrderReq = map[int16]string{\n\t1: \"user_id\",\n\t2: \"address\",\n\t3: \"product_id\",\n\t4: \"stock_num\",\n}\n\nfunc (p *CreateOrderReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetUserId bool = false\n\tvar issetAddress bool = false\n\tvar issetProductId bool = false\n\tvar issetStockNum bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetUserId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetAddress = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetStockNum = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetUserId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetAddress {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetProductId {\n\t\tfieldId = 3\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetStockNum {\n\t\tfieldId = 4\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_CreateOrderReq[fieldId]))\n}\n\nfunc (p *CreateOrderReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateOrderReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Address = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateOrderReq) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductId = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateOrderReq) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StockNum = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateOrderReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateOrderReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateOrderReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateOrderReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"address\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Address); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CreateOrderReq) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"product_id\", thrift.I64, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ProductId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *CreateOrderReq) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"stock_num\", thrift.I64, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.StockNum); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *CreateOrderReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateOrderReq(%+v)\", *p)\n}\n\nfunc (p *CreateOrderReq) DeepEqual(ano *CreateOrderReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Address) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.ProductId) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.StockNum) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CreateOrderReq) Field1DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CreateOrderReq) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Address, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CreateOrderReq) Field3DeepEqual(src int64) bool {\n\n\tif p.ProductId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CreateOrderReq) Field4DeepEqual(src int64) bool {\n\n\tif p.StockNum != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CreateOrderResp struct {\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewCreateOrderResp() *CreateOrderResp {\n\treturn &CreateOrderResp{}\n}\n\nvar CreateOrderResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *CreateOrderResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CreateOrderResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *CreateOrderResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_CreateOrderResp = map[int16]string{\n\t255: \"BaseResp\",\n}\n\nfunc (p *CreateOrderResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CreateOrderResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateOrderResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateOrderResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CreateOrderResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateOrderResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateOrderResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *CreateOrderResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateOrderResp(%+v)\", *p)\n}\n\nfunc (p *CreateOrderResp) DeepEqual(ano *CreateOrderResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CreateOrderResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CancelOrderReq struct {\n\tOrderId int64 `thrift:\"order_id,1,required\" json:\"order_id\"`\n}\n\nfunc NewCancelOrderReq() *CancelOrderReq {\n\treturn &CancelOrderReq{}\n}\n\nfunc (p *CancelOrderReq) GetOrderId() (v int64) {\n\treturn p.OrderId\n}\nfunc (p *CancelOrderReq) SetOrderId(val int64) {\n\tp.OrderId = val\n}\n\nvar fieldIDToName_CancelOrderReq = map[int16]string{\n\t1: \"order_id\",\n}\n\nfunc (p *CancelOrderReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetOrderId bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetOrderId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetOrderId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CancelOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_CancelOrderReq[fieldId]))\n}\n\nfunc (p *CancelOrderReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OrderId = v\n\t}\n\treturn nil\n}\n\nfunc (p *CancelOrderReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CancelOrderReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CancelOrderReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"order_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.OrderId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CancelOrderReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CancelOrderReq(%+v)\", *p)\n}\n\nfunc (p *CancelOrderReq) DeepEqual(ano *CancelOrderReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.OrderId) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CancelOrderReq) Field1DeepEqual(src int64) bool {\n\n\tif p.OrderId != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CancelOrderResp struct {\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewCancelOrderResp() *CancelOrderResp {\n\treturn &CancelOrderResp{}\n}\n\nvar CancelOrderResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *CancelOrderResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CancelOrderResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *CancelOrderResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_CancelOrderResp = map[int16]string{\n\t255: \"BaseResp\",\n}\n\nfunc (p *CancelOrderResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CancelOrderResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CancelOrderResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CancelOrderResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CancelOrderResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CancelOrderResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CancelOrderResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *CancelOrderResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CancelOrderResp(%+v)\", *p)\n}\n\nfunc (p *CancelOrderResp) DeepEqual(ano *CancelOrderResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CancelOrderResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ListOrderReq struct {\n\tUserId int64   `thrift:\"user_id,1,required\" json:\"user_id\"`\n\tStatus *Status `thrift:\"status,2\" json:\"status,omitempty\"`\n}\n\nfunc NewListOrderReq() *ListOrderReq {\n\treturn &ListOrderReq{}\n}\n\nfunc (p *ListOrderReq) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nvar ListOrderReq_Status_DEFAULT Status\n\nfunc (p *ListOrderReq) GetStatus() (v Status) {\n\tif !p.IsSetStatus() {\n\t\treturn ListOrderReq_Status_DEFAULT\n\t}\n\treturn *p.Status\n}\nfunc (p *ListOrderReq) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *ListOrderReq) SetStatus(val *Status) {\n\tp.Status = val\n}\n\nvar fieldIDToName_ListOrderReq = map[int16]string{\n\t1: \"user_id\",\n\t2: \"status\",\n}\n\nfunc (p *ListOrderReq) IsSetStatus() bool {\n\treturn p.Status != nil\n}\n\nfunc (p *ListOrderReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetUserId bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetUserId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetUserId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_ListOrderReq[fieldId]))\n}\n\nfunc (p *ListOrderReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *ListOrderReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn err\n\t} else {\n\t\ttmp := Status(v)\n\t\tp.Status = &tmp\n\t}\n\treturn nil\n}\n\nfunc (p *ListOrderReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ListOrderReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ListOrderReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ListOrderReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetStatus() {\n\t\tif err = oprot.WriteFieldBegin(\"status\", thrift.I32, 2); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteI32(int32(*p.Status)); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *ListOrderReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ListOrderReq(%+v)\", *p)\n}\n\nfunc (p *ListOrderReq) DeepEqual(ano *ListOrderReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Status) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ListOrderReq) Field1DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *ListOrderReq) Field2DeepEqual(src *Status) bool {\n\n\tif p.Status == src {\n\t\treturn true\n\t} else if p.Status == nil || src == nil {\n\t\treturn false\n\t}\n\tif *p.Status != *src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ListOrderResp struct {\n\tOrders   []*OrderItem   `thrift:\"orders,1\" json:\"orders\"`\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewListOrderResp() *ListOrderResp {\n\treturn &ListOrderResp{}\n}\n\nfunc (p *ListOrderResp) GetOrders() (v []*OrderItem) {\n\treturn p.Orders\n}\n\nvar ListOrderResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *ListOrderResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn ListOrderResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *ListOrderResp) SetOrders(val []*OrderItem) {\n\tp.Orders = val\n}\nfunc (p *ListOrderResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_ListOrderResp = map[int16]string{\n\t1:   \"orders\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *ListOrderResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *ListOrderResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListOrderResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ListOrderResp) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Orders = make([]*OrderItem, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewOrderItem()\n\t\tif err := _elem.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.Orders = append(p.Orders, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ListOrderResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ListOrderResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ListOrderResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ListOrderResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"orders\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Orders)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Orders {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ListOrderResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *ListOrderResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ListOrderResp(%+v)\", *p)\n}\n\nfunc (p *ListOrderResp) DeepEqual(ano *ListOrderResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Orders) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ListOrderResp) Field1DeepEqual(src []*OrderItem) bool {\n\n\tif len(p.Orders) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.Orders {\n\t\t_src := src[i]\n\t\tif !v.DeepEqual(_src) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc (p *ListOrderResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype GetOrderByIdReq struct {\n\tOrderId int64 `thrift:\"order_id,1,required\" json:\"order_id\"`\n}\n\nfunc NewGetOrderByIdReq() *GetOrderByIdReq {\n\treturn &GetOrderByIdReq{}\n}\n\nfunc (p *GetOrderByIdReq) GetOrderId() (v int64) {\n\treturn p.OrderId\n}\nfunc (p *GetOrderByIdReq) SetOrderId(val int64) {\n\tp.OrderId = val\n}\n\nvar fieldIDToName_GetOrderByIdReq = map[int16]string{\n\t1: \"order_id\",\n}\n\nfunc (p *GetOrderByIdReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetOrderId bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetOrderId = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetOrderId {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetOrderByIdReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetOrderByIdReq[fieldId]))\n}\n\nfunc (p *GetOrderByIdReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OrderId = v\n\t}\n\treturn nil\n}\n\nfunc (p *GetOrderByIdReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetOrderByIdReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *GetOrderByIdReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"order_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.OrderId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *GetOrderByIdReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"GetOrderByIdReq(%+v)\", *p)\n}\n\nfunc (p *GetOrderByIdReq) DeepEqual(ano *GetOrderByIdReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.OrderId) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *GetOrderByIdReq) Field1DeepEqual(src int64) bool {\n\n\tif p.OrderId != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype GetOrderByIdResp struct {\n\tOrder    *OrderItem     `thrift:\"order,1\" json:\"order\"`\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewGetOrderByIdResp() *GetOrderByIdResp {\n\treturn &GetOrderByIdResp{}\n}\n\nvar GetOrderByIdResp_Order_DEFAULT *OrderItem\n\nfunc (p *GetOrderByIdResp) GetOrder() (v *OrderItem) {\n\tif !p.IsSetOrder() {\n\t\treturn GetOrderByIdResp_Order_DEFAULT\n\t}\n\treturn p.Order\n}\n\nvar GetOrderByIdResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *GetOrderByIdResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn GetOrderByIdResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *GetOrderByIdResp) SetOrder(val *OrderItem) {\n\tp.Order = val\n}\nfunc (p *GetOrderByIdResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_GetOrderByIdResp = map[int16]string{\n\t1:   \"order\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *GetOrderByIdResp) IsSetOrder() bool {\n\treturn p.Order != nil\n}\n\nfunc (p *GetOrderByIdResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *GetOrderByIdResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetOrderByIdResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *GetOrderByIdResp) ReadField1(iprot thrift.TProtocol) error {\n\tp.Order = NewOrderItem()\n\tif err := p.Order.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *GetOrderByIdResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *GetOrderByIdResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetOrderByIdResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *GetOrderByIdResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"order\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Order.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *GetOrderByIdResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *GetOrderByIdResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"GetOrderByIdResp(%+v)\", *p)\n}\n\nfunc (p *GetOrderByIdResp) DeepEqual(ano *GetOrderByIdResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Order) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *GetOrderByIdResp) Field1DeepEqual(src *OrderItem) bool {\n\n\tif !p.Order.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *GetOrderByIdResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OrderService interface {\n\tCreateOrder(ctx context.Context, req *CreateOrderReq) (r *CreateOrderResp, err error)\n\n\tCancelOrder(ctx context.Context, req *CancelOrderReq) (r *CancelOrderResp, err error)\n\n\tListOrder(ctx context.Context, req *ListOrderReq) (r *ListOrderResp, err error)\n\n\tGetOrderById(ctx context.Context, req *GetOrderByIdReq) (r *GetOrderByIdResp, err error)\n}\n\ntype OrderServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewOrderServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *OrderServiceClient {\n\treturn &OrderServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewOrderServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *OrderServiceClient {\n\treturn &OrderServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewOrderServiceClient(c thrift.TClient) *OrderServiceClient {\n\treturn &OrderServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *OrderServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *OrderServiceClient) CreateOrder(ctx context.Context, req *CreateOrderReq) (r *CreateOrderResp, err error) {\n\tvar _args OrderServiceCreateOrderArgs\n\t_args.Req = req\n\tvar _result OrderServiceCreateOrderResult\n\tif err = p.Client_().Call(ctx, \"CreateOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *OrderServiceClient) CancelOrder(ctx context.Context, req *CancelOrderReq) (r *CancelOrderResp, err error) {\n\tvar _args OrderServiceCancelOrderArgs\n\t_args.Req = req\n\tvar _result OrderServiceCancelOrderResult\n\tif err = p.Client_().Call(ctx, \"CancelOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *OrderServiceClient) ListOrder(ctx context.Context, req *ListOrderReq) (r *ListOrderResp, err error) {\n\tvar _args OrderServiceListOrderArgs\n\t_args.Req = req\n\tvar _result OrderServiceListOrderResult\n\tif err = p.Client_().Call(ctx, \"ListOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *OrderServiceClient) GetOrderById(ctx context.Context, req *GetOrderByIdReq) (r *GetOrderByIdResp, err error) {\n\tvar _args OrderServiceGetOrderByIdArgs\n\t_args.Req = req\n\tvar _result OrderServiceGetOrderByIdResult\n\tif err = p.Client_().Call(ctx, \"GetOrderById\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype OrderServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      OrderService\n}\n\nfunc (p *OrderServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *OrderServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *OrderServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewOrderServiceProcessor(handler OrderService) *OrderServiceProcessor {\n\tself := &OrderServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"CreateOrder\", &orderServiceProcessorCreateOrder{handler: handler})\n\tself.AddToProcessorMap(\"CancelOrder\", &orderServiceProcessorCancelOrder{handler: handler})\n\tself.AddToProcessorMap(\"ListOrder\", &orderServiceProcessorListOrder{handler: handler})\n\tself.AddToProcessorMap(\"GetOrderById\", &orderServiceProcessorGetOrderById{handler: handler})\n\treturn self\n}\nfunc (p *OrderServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype orderServiceProcessorCreateOrder struct {\n\thandler OrderService\n}\n\nfunc (p *orderServiceProcessorCreateOrder) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := OrderServiceCreateOrderArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CreateOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := OrderServiceCreateOrderResult{}\n\tvar retval *CreateOrderResp\n\tif retval, err2 = p.handler.CreateOrder(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CreateOrder: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CreateOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CreateOrder\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype orderServiceProcessorCancelOrder struct {\n\thandler OrderService\n}\n\nfunc (p *orderServiceProcessorCancelOrder) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := OrderServiceCancelOrderArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CancelOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := OrderServiceCancelOrderResult{}\n\tvar retval *CancelOrderResp\n\tif retval, err2 = p.handler.CancelOrder(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CancelOrder: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CancelOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CancelOrder\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype orderServiceProcessorListOrder struct {\n\thandler OrderService\n}\n\nfunc (p *orderServiceProcessorListOrder) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := OrderServiceListOrderArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"ListOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := OrderServiceListOrderResult{}\n\tvar retval *ListOrderResp\n\tif retval, err2 = p.handler.ListOrder(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing ListOrder: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"ListOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"ListOrder\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype orderServiceProcessorGetOrderById struct {\n\thandler OrderService\n}\n\nfunc (p *orderServiceProcessorGetOrderById) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := OrderServiceGetOrderByIdArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"GetOrderById\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := OrderServiceGetOrderByIdResult{}\n\tvar retval *GetOrderByIdResp\n\tif retval, err2 = p.handler.GetOrderById(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing GetOrderById: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"GetOrderById\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"GetOrderById\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype OrderServiceCreateOrderArgs struct {\n\tReq *CreateOrderReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewOrderServiceCreateOrderArgs() *OrderServiceCreateOrderArgs {\n\treturn &OrderServiceCreateOrderArgs{}\n}\n\nvar OrderServiceCreateOrderArgs_Req_DEFAULT *CreateOrderReq\n\nfunc (p *OrderServiceCreateOrderArgs) GetReq() (v *CreateOrderReq) {\n\tif !p.IsSetReq() {\n\t\treturn OrderServiceCreateOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *OrderServiceCreateOrderArgs) SetReq(val *CreateOrderReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_OrderServiceCreateOrderArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *OrderServiceCreateOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *OrderServiceCreateOrderArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceCreateOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCreateOrderArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCreateOrderReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OrderServiceCreateOrderArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateOrder_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCreateOrderArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *OrderServiceCreateOrderArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OrderServiceCreateOrderArgs(%+v)\", *p)\n}\n\nfunc (p *OrderServiceCreateOrderArgs) DeepEqual(ano *OrderServiceCreateOrderArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OrderServiceCreateOrderArgs) Field1DeepEqual(src *CreateOrderReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OrderServiceCreateOrderResult struct {\n\tSuccess *CreateOrderResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewOrderServiceCreateOrderResult() *OrderServiceCreateOrderResult {\n\treturn &OrderServiceCreateOrderResult{}\n}\n\nvar OrderServiceCreateOrderResult_Success_DEFAULT *CreateOrderResp\n\nfunc (p *OrderServiceCreateOrderResult) GetSuccess() (v *CreateOrderResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn OrderServiceCreateOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *OrderServiceCreateOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*CreateOrderResp)\n}\n\nvar fieldIDToName_OrderServiceCreateOrderResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *OrderServiceCreateOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *OrderServiceCreateOrderResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceCreateOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCreateOrderResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCreateOrderResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OrderServiceCreateOrderResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateOrder_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCreateOrderResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *OrderServiceCreateOrderResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OrderServiceCreateOrderResult(%+v)\", *p)\n}\n\nfunc (p *OrderServiceCreateOrderResult) DeepEqual(ano *OrderServiceCreateOrderResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OrderServiceCreateOrderResult) Field0DeepEqual(src *CreateOrderResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OrderServiceCancelOrderArgs struct {\n\tReq *CancelOrderReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewOrderServiceCancelOrderArgs() *OrderServiceCancelOrderArgs {\n\treturn &OrderServiceCancelOrderArgs{}\n}\n\nvar OrderServiceCancelOrderArgs_Req_DEFAULT *CancelOrderReq\n\nfunc (p *OrderServiceCancelOrderArgs) GetReq() (v *CancelOrderReq) {\n\tif !p.IsSetReq() {\n\t\treturn OrderServiceCancelOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *OrderServiceCancelOrderArgs) SetReq(val *CancelOrderReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_OrderServiceCancelOrderArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *OrderServiceCancelOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *OrderServiceCancelOrderArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceCancelOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCancelOrderArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCancelOrderReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OrderServiceCancelOrderArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CancelOrder_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCancelOrderArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *OrderServiceCancelOrderArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OrderServiceCancelOrderArgs(%+v)\", *p)\n}\n\nfunc (p *OrderServiceCancelOrderArgs) DeepEqual(ano *OrderServiceCancelOrderArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OrderServiceCancelOrderArgs) Field1DeepEqual(src *CancelOrderReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OrderServiceCancelOrderResult struct {\n\tSuccess *CancelOrderResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewOrderServiceCancelOrderResult() *OrderServiceCancelOrderResult {\n\treturn &OrderServiceCancelOrderResult{}\n}\n\nvar OrderServiceCancelOrderResult_Success_DEFAULT *CancelOrderResp\n\nfunc (p *OrderServiceCancelOrderResult) GetSuccess() (v *CancelOrderResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn OrderServiceCancelOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *OrderServiceCancelOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*CancelOrderResp)\n}\n\nvar fieldIDToName_OrderServiceCancelOrderResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *OrderServiceCancelOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *OrderServiceCancelOrderResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceCancelOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCancelOrderResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCancelOrderResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OrderServiceCancelOrderResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CancelOrder_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceCancelOrderResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *OrderServiceCancelOrderResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OrderServiceCancelOrderResult(%+v)\", *p)\n}\n\nfunc (p *OrderServiceCancelOrderResult) DeepEqual(ano *OrderServiceCancelOrderResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OrderServiceCancelOrderResult) Field0DeepEqual(src *CancelOrderResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OrderServiceListOrderArgs struct {\n\tReq *ListOrderReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewOrderServiceListOrderArgs() *OrderServiceListOrderArgs {\n\treturn &OrderServiceListOrderArgs{}\n}\n\nvar OrderServiceListOrderArgs_Req_DEFAULT *ListOrderReq\n\nfunc (p *OrderServiceListOrderArgs) GetReq() (v *ListOrderReq) {\n\tif !p.IsSetReq() {\n\t\treturn OrderServiceListOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *OrderServiceListOrderArgs) SetReq(val *ListOrderReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_OrderServiceListOrderArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *OrderServiceListOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *OrderServiceListOrderArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceListOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceListOrderArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewListOrderReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OrderServiceListOrderArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ListOrder_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceListOrderArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *OrderServiceListOrderArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OrderServiceListOrderArgs(%+v)\", *p)\n}\n\nfunc (p *OrderServiceListOrderArgs) DeepEqual(ano *OrderServiceListOrderArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OrderServiceListOrderArgs) Field1DeepEqual(src *ListOrderReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OrderServiceListOrderResult struct {\n\tSuccess *ListOrderResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewOrderServiceListOrderResult() *OrderServiceListOrderResult {\n\treturn &OrderServiceListOrderResult{}\n}\n\nvar OrderServiceListOrderResult_Success_DEFAULT *ListOrderResp\n\nfunc (p *OrderServiceListOrderResult) GetSuccess() (v *ListOrderResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn OrderServiceListOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *OrderServiceListOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*ListOrderResp)\n}\n\nvar fieldIDToName_OrderServiceListOrderResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *OrderServiceListOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *OrderServiceListOrderResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceListOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceListOrderResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewListOrderResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OrderServiceListOrderResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ListOrder_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceListOrderResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *OrderServiceListOrderResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OrderServiceListOrderResult(%+v)\", *p)\n}\n\nfunc (p *OrderServiceListOrderResult) DeepEqual(ano *OrderServiceListOrderResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OrderServiceListOrderResult) Field0DeepEqual(src *ListOrderResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OrderServiceGetOrderByIdArgs struct {\n\tReq *GetOrderByIdReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewOrderServiceGetOrderByIdArgs() *OrderServiceGetOrderByIdArgs {\n\treturn &OrderServiceGetOrderByIdArgs{}\n}\n\nvar OrderServiceGetOrderByIdArgs_Req_DEFAULT *GetOrderByIdReq\n\nfunc (p *OrderServiceGetOrderByIdArgs) GetReq() (v *GetOrderByIdReq) {\n\tif !p.IsSetReq() {\n\t\treturn OrderServiceGetOrderByIdArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *OrderServiceGetOrderByIdArgs) SetReq(val *GetOrderByIdReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_OrderServiceGetOrderByIdArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceGetOrderByIdArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewGetOrderByIdReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetOrderById_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OrderServiceGetOrderByIdArgs(%+v)\", *p)\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) DeepEqual(ano *OrderServiceGetOrderByIdArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OrderServiceGetOrderByIdArgs) Field1DeepEqual(src *GetOrderByIdReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype OrderServiceGetOrderByIdResult struct {\n\tSuccess *GetOrderByIdResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewOrderServiceGetOrderByIdResult() *OrderServiceGetOrderByIdResult {\n\treturn &OrderServiceGetOrderByIdResult{}\n}\n\nvar OrderServiceGetOrderByIdResult_Success_DEFAULT *GetOrderByIdResp\n\nfunc (p *OrderServiceGetOrderByIdResult) GetSuccess() (v *GetOrderByIdResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn OrderServiceGetOrderByIdResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *OrderServiceGetOrderByIdResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*GetOrderByIdResp)\n}\n\nvar fieldIDToName_OrderServiceGetOrderByIdResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_OrderServiceGetOrderByIdResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewGetOrderByIdResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetOrderById_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OrderServiceGetOrderByIdResult(%+v)\", *p)\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) DeepEqual(ano *OrderServiceGetOrderByIdResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *OrderServiceGetOrderByIdResult) Field0DeepEqual(src *GetOrderByIdResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/order/orderservice/client.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCreateOrder(ctx context.Context, req *order.CreateOrderReq, callOptions ...callopt.Option) (r *order.CreateOrderResp, err error)\n\tCancelOrder(ctx context.Context, req *order.CancelOrderReq, callOptions ...callopt.Option) (r *order.CancelOrderResp, err error)\n\tListOrder(ctx context.Context, req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n\tGetOrderById(ctx context.Context, req *order.GetOrderByIdReq, callOptions ...callopt.Option) (r *order.GetOrderByIdResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kOrderServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kOrderServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kOrderServiceClient) CreateOrder(ctx context.Context, req *order.CreateOrderReq, callOptions ...callopt.Option) (r *order.CreateOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.CreateOrder(ctx, req)\n}\n\nfunc (p *kOrderServiceClient) CancelOrder(ctx context.Context, req *order.CancelOrderReq, callOptions ...callopt.Option) (r *order.CancelOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.CancelOrder(ctx, req)\n}\n\nfunc (p *kOrderServiceClient) ListOrder(ctx context.Context, req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListOrder(ctx, req)\n}\n\nfunc (p *kOrderServiceClient) GetOrderById(ctx context.Context, req *order.GetOrderByIdReq, callOptions ...callopt.Option) (r *order.GetOrderByIdResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetOrderById(ctx, req)\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/order/orderservice/invoker.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler order.OrderService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/order/orderservice/orderservice.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn orderServiceServiceInfo\n}\n\nvar orderServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"OrderService\"\n\thandlerType := (*order.OrderService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"CreateOrder\":  kitex.NewMethodInfo(createOrderHandler, newOrderServiceCreateOrderArgs, newOrderServiceCreateOrderResult, false),\n\t\t\"CancelOrder\":  kitex.NewMethodInfo(cancelOrderHandler, newOrderServiceCancelOrderArgs, newOrderServiceCancelOrderResult, false),\n\t\t\"ListOrder\":    kitex.NewMethodInfo(listOrderHandler, newOrderServiceListOrderArgs, newOrderServiceListOrderResult, false),\n\t\t\"GetOrderById\": kitex.NewMethodInfo(getOrderByIdHandler, newOrderServiceGetOrderByIdArgs, newOrderServiceGetOrderByIdResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"order\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.3\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc createOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*order.OrderServiceCreateOrderArgs)\n\trealResult := result.(*order.OrderServiceCreateOrderResult)\n\tsuccess, err := handler.(order.OrderService).CreateOrder(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newOrderServiceCreateOrderArgs() interface{} {\n\treturn order.NewOrderServiceCreateOrderArgs()\n}\n\nfunc newOrderServiceCreateOrderResult() interface{} {\n\treturn order.NewOrderServiceCreateOrderResult()\n}\n\nfunc cancelOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*order.OrderServiceCancelOrderArgs)\n\trealResult := result.(*order.OrderServiceCancelOrderResult)\n\tsuccess, err := handler.(order.OrderService).CancelOrder(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newOrderServiceCancelOrderArgs() interface{} {\n\treturn order.NewOrderServiceCancelOrderArgs()\n}\n\nfunc newOrderServiceCancelOrderResult() interface{} {\n\treturn order.NewOrderServiceCancelOrderResult()\n}\n\nfunc listOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*order.OrderServiceListOrderArgs)\n\trealResult := result.(*order.OrderServiceListOrderResult)\n\tsuccess, err := handler.(order.OrderService).ListOrder(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newOrderServiceListOrderArgs() interface{} {\n\treturn order.NewOrderServiceListOrderArgs()\n}\n\nfunc newOrderServiceListOrderResult() interface{} {\n\treturn order.NewOrderServiceListOrderResult()\n}\n\nfunc getOrderByIdHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*order.OrderServiceGetOrderByIdArgs)\n\trealResult := result.(*order.OrderServiceGetOrderByIdResult)\n\tsuccess, err := handler.(order.OrderService).GetOrderById(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newOrderServiceGetOrderByIdArgs() interface{} {\n\treturn order.NewOrderServiceGetOrderByIdArgs()\n}\n\nfunc newOrderServiceGetOrderByIdResult() interface{} {\n\treturn order.NewOrderServiceGetOrderByIdResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) CreateOrder(ctx context.Context, req *order.CreateOrderReq) (r *order.CreateOrderResp, err error) {\n\tvar _args order.OrderServiceCreateOrderArgs\n\t_args.Req = req\n\tvar _result order.OrderServiceCreateOrderResult\n\tif err = p.c.Call(ctx, \"CreateOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) CancelOrder(ctx context.Context, req *order.CancelOrderReq) (r *order.CancelOrderResp, err error) {\n\tvar _args order.OrderServiceCancelOrderArgs\n\t_args.Req = req\n\tvar _result order.OrderServiceCancelOrderResult\n\tif err = p.c.Call(ctx, \"CancelOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) ListOrder(ctx context.Context, req *order.ListOrderReq) (r *order.ListOrderResp, err error) {\n\tvar _args order.OrderServiceListOrderArgs\n\t_args.Req = req\n\tvar _result order.OrderServiceListOrderResult\n\tif err = p.c.Call(ctx, \"ListOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetOrderById(ctx context.Context, req *order.GetOrderByIdReq) (r *order.GetOrderByIdResp, err error) {\n\tvar _args order.OrderServiceGetOrderByIdArgs\n\t_args.Req = req\n\tvar _result order.OrderServiceGetOrderByIdResult\n\tif err = p.c.Call(ctx, \"GetOrderById\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/order/orderservice/server.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler order.OrderService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/user/k-consts.go",
    "content": "package user\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/user/k-user.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage user\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/base\"\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n\t_ = base.KitexUnusedProtection\n)\n\nfunc (p *User) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_User[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *User) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *User) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserName = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *User) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *User) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"User\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *User) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"User\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *User) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"UserId\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *User) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"UserName\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.UserName)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *User) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"UserId\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *User) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"UserName\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.UserName)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserName = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CreateUserReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Password = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CreateUserReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CreateUserReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateUserReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateUserReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"UserName\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.UserName)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Password\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Password)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"UserName\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.UserName)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserReq) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Password\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Password)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CreateUserResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CreateUserResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateUserResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateUserResp\")\n\tif p != nil {\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetUserReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetUserReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Ids = make([]int64, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _elem int64\n\t\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\n\t\t\t_elem = v\n\n\t\t}\n\n\t\tp.Ids = append(p.Ids, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *MGetUserReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *MGetUserReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetUserReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetUserReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Ids\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.I64, 0)\n\tvar length int\n\tfor _, v := range p.Ids {\n\t\tlength++\n\t\toffset += bthrift.Binary.WriteI64(buf[offset:], v)\n\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.I64, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Ids\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.I64, len(p.Ids))\n\tvar tmpV int64\n\tl += bthrift.Binary.I64Length(int64(tmpV)) * len(p.Ids)\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetUserResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetUserResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Users = make([]*User, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewUser()\n\t\tif l, err := _elem.FastRead(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\t\t}\n\n\t\tp.Users = append(p.Users, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\nfunc (p *MGetUserResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *MGetUserResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *MGetUserResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetUserResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetUserResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Users\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.STRUCT, 0)\n\tvar length int\n\tfor _, v := range p.Users {\n\t\tlength++\n\t\toffset += v.FastWriteNocopy(buf[offset:], binaryWriter)\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.STRUCT, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Users\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.STRUCT, len(p.Users))\n\tfor _, v := range p.Users {\n\t\tl += v.BLength()\n\t}\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserName = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CheckUserReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Password = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CheckUserReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CheckUserReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CheckUserReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CheckUserReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"UserName\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.UserName)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Password\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Password)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"UserName\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.UserName)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserReq) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Password\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Password)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CheckUserResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CheckUserResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CheckUserResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CheckUserResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CheckUserResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"UserId\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"UserId\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCreateUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCreateUserReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceCreateUserArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceCreateUserArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateUser_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCreateUserArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateUser_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCreateUserArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCreateUserResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCreateUserResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceCreateUserResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceCreateUserResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateUser_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCreateUserResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateUser_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *UserServiceCreateUserResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *UserServiceMGetUserArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceMGetUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewMGetUserReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceMGetUserArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceMGetUserArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetUser_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceMGetUserArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetUser_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceMGetUserArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceMGetUserArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceMGetUserResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceMGetUserResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewMGetUserResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceMGetUserResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceMGetUserResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetUser_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceMGetUserResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetUser_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceMGetUserResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *UserServiceMGetUserResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *UserServiceCheckUserArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCheckUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCheckUserReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceCheckUserArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceCheckUserArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CheckUser_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCheckUserArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CheckUser_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCheckUserArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCheckUserArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCheckUserResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCheckUserResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCheckUserResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceCheckUserResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceCheckUserResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CheckUser_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCheckUserResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CheckUser_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCheckUserResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *UserServiceCheckUserResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *UserServiceCreateUserResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *UserServiceMGetUserArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *UserServiceMGetUserResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *UserServiceCheckUserArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *UserServiceCheckUserResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/user/user.go",
    "content": "// Code generated by thriftgo (0.1.7). DO NOT EDIT.\n\npackage user\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/base\"\n\t\"strings\"\n)\n\ntype User struct {\n\tUserId   int64  `thrift:\"UserId,1\" json:\"UserId\"`\n\tUserName string `thrift:\"UserName,2\" json:\"UserName\"`\n}\n\nfunc NewUser() *User {\n\treturn &User{}\n}\n\nfunc (p *User) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nfunc (p *User) GetUserName() (v string) {\n\treturn p.UserName\n}\nfunc (p *User) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *User) SetUserName(val string) {\n\tp.UserName = val\n}\n\nvar fieldIDToName_User = map[int16]string{\n\t1: \"UserId\",\n\t2: \"UserName\",\n}\n\nfunc (p *User) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_User[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *User) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *User) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserName = v\n\t}\n\treturn nil\n}\n\nfunc (p *User) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"User\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *User) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"UserId\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *User) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"UserName\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.UserName); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *User) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"User(%+v)\", *p)\n}\n\nfunc (p *User) DeepEqual(ano *User) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.UserName) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *User) Field1DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *User) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.UserName, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CreateUserReq struct {\n\tUserName string `thrift:\"UserName,1\" json:\"UserName\"`\n\tPassword string `thrift:\"Password,2\" json:\"Password\"`\n}\n\nfunc NewCreateUserReq() *CreateUserReq {\n\treturn &CreateUserReq{}\n}\n\nfunc (p *CreateUserReq) GetUserName() (v string) {\n\treturn p.UserName\n}\n\nfunc (p *CreateUserReq) GetPassword() (v string) {\n\treturn p.Password\n}\nfunc (p *CreateUserReq) SetUserName(val string) {\n\tp.UserName = val\n}\nfunc (p *CreateUserReq) SetPassword(val string) {\n\tp.Password = val\n}\n\nvar fieldIDToName_CreateUserReq = map[int16]string{\n\t1: \"UserName\",\n\t2: \"Password\",\n}\n\nfunc (p *CreateUserReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserName = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateUserReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Password = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateUserReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUserReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateUserReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"UserName\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.UserName); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateUserReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Password\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Password); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CreateUserReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateUserReq(%+v)\", *p)\n}\n\nfunc (p *CreateUserReq) DeepEqual(ano *CreateUserReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserName) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Password) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CreateUserReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.UserName, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CreateUserReq) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Password, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CreateUserResp struct {\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewCreateUserResp() *CreateUserResp {\n\treturn &CreateUserResp{}\n}\n\nvar CreateUserResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *CreateUserResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CreateUserResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *CreateUserResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_CreateUserResp = map[int16]string{\n\t255: \"BaseResp\",\n}\n\nfunc (p *CreateUserResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CreateUserResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CreateUserResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUserResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateUserResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *CreateUserResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateUserResp(%+v)\", *p)\n}\n\nfunc (p *CreateUserResp) DeepEqual(ano *CreateUserResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CreateUserResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype MGetUserReq struct {\n\tIds []int64 `thrift:\"Ids,1\" json:\"Ids\"`\n}\n\nfunc NewMGetUserReq() *MGetUserReq {\n\treturn &MGetUserReq{}\n}\n\nfunc (p *MGetUserReq) GetIds() (v []int64) {\n\treturn p.Ids\n}\nfunc (p *MGetUserReq) SetIds(val []int64) {\n\tp.Ids = val\n}\n\nvar fieldIDToName_MGetUserReq = map[int16]string{\n\t1: \"Ids\",\n}\n\nfunc (p *MGetUserReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetUserReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetUserReq) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Ids = make([]int64, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _elem int64\n\t\tif v, err := iprot.ReadI64(); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t_elem = v\n\t\t}\n\n\t\tp.Ids = append(p.Ids, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGetUserReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetUserReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *MGetUserReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Ids\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.I64, len(p.Ids)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Ids {\n\t\tif err := oprot.WriteI64(v); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *MGetUserReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"MGetUserReq(%+v)\", *p)\n}\n\nfunc (p *MGetUserReq) DeepEqual(ano *MGetUserReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Ids) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *MGetUserReq) Field1DeepEqual(src []int64) bool {\n\n\tif len(p.Ids) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.Ids {\n\t\t_src := src[i]\n\t\tif v != _src {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\ntype MGetUserResp struct {\n\tUsers    []*User        `thrift:\"Users,1\" json:\"Users\"`\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewMGetUserResp() *MGetUserResp {\n\treturn &MGetUserResp{}\n}\n\nfunc (p *MGetUserResp) GetUsers() (v []*User) {\n\treturn p.Users\n}\n\nvar MGetUserResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *MGetUserResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn MGetUserResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *MGetUserResp) SetUsers(val []*User) {\n\tp.Users = val\n}\nfunc (p *MGetUserResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_MGetUserResp = map[int16]string{\n\t1:   \"Users\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *MGetUserResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *MGetUserResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetUserResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetUserResp) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Users = make([]*User, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewUser()\n\t\tif err := _elem.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.Users = append(p.Users, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGetUserResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGetUserResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetUserResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *MGetUserResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Users\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Users)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Users {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *MGetUserResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *MGetUserResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"MGetUserResp(%+v)\", *p)\n}\n\nfunc (p *MGetUserResp) DeepEqual(ano *MGetUserResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Users) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *MGetUserResp) Field1DeepEqual(src []*User) bool {\n\n\tif len(p.Users) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.Users {\n\t\t_src := src[i]\n\t\tif !v.DeepEqual(_src) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc (p *MGetUserResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CheckUserReq struct {\n\tUserName string `thrift:\"UserName,1\" json:\"UserName\"`\n\tPassword string `thrift:\"Password,2\" json:\"Password\"`\n}\n\nfunc NewCheckUserReq() *CheckUserReq {\n\treturn &CheckUserReq{}\n}\n\nfunc (p *CheckUserReq) GetUserName() (v string) {\n\treturn p.UserName\n}\n\nfunc (p *CheckUserReq) GetPassword() (v string) {\n\treturn p.Password\n}\nfunc (p *CheckUserReq) SetUserName(val string) {\n\tp.UserName = val\n}\nfunc (p *CheckUserReq) SetPassword(val string) {\n\tp.Password = val\n}\n\nvar fieldIDToName_CheckUserReq = map[int16]string{\n\t1: \"UserName\",\n\t2: \"Password\",\n}\n\nfunc (p *CheckUserReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserName = v\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Password = v\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUserReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CheckUserReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"UserName\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.UserName); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CheckUserReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Password\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Password); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CheckUserReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CheckUserReq(%+v)\", *p)\n}\n\nfunc (p *CheckUserReq) DeepEqual(ano *CheckUserReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserName) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Password) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CheckUserReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.UserName, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CheckUserReq) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Password, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CheckUserResp struct {\n\tUserId   int64          `thrift:\"UserId,1\" json:\"UserId\"`\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewCheckUserResp() *CheckUserResp {\n\treturn &CheckUserResp{}\n}\n\nfunc (p *CheckUserResp) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nvar CheckUserResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *CheckUserResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CheckUserResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *CheckUserResp) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *CheckUserResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_CheckUserResp = map[int16]string{\n\t1:   \"UserId\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *CheckUserResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CheckUserResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUserResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CheckUserResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"UserId\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CheckUserResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *CheckUserResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CheckUserResp(%+v)\", *p)\n}\n\nfunc (p *CheckUserResp) DeepEqual(ano *CheckUserResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CheckUserResp) Field1DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CheckUserResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserService interface {\n\tCreateUser(ctx context.Context, req *CreateUserReq) (r *CreateUserResp, err error)\n\n\tMGetUser(ctx context.Context, req *MGetUserReq) (r *MGetUserResp, err error)\n\n\tCheckUser(ctx context.Context, req *CheckUserReq) (r *CheckUserResp, err error)\n}\n\ntype UserServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewUserServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *UserServiceClient {\n\treturn &UserServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewUserServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *UserServiceClient {\n\treturn &UserServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewUserServiceClient(c thrift.TClient) *UserServiceClient {\n\treturn &UserServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *UserServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *UserServiceClient) CreateUser(ctx context.Context, req *CreateUserReq) (r *CreateUserResp, err error) {\n\tvar _args UserServiceCreateUserArgs\n\t_args.Req = req\n\tvar _result UserServiceCreateUserResult\n\tif err = p.Client_().Call(ctx, \"CreateUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *UserServiceClient) MGetUser(ctx context.Context, req *MGetUserReq) (r *MGetUserResp, err error) {\n\tvar _args UserServiceMGetUserArgs\n\t_args.Req = req\n\tvar _result UserServiceMGetUserResult\n\tif err = p.Client_().Call(ctx, \"MGetUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *UserServiceClient) CheckUser(ctx context.Context, req *CheckUserReq) (r *CheckUserResp, err error) {\n\tvar _args UserServiceCheckUserArgs\n\t_args.Req = req\n\tvar _result UserServiceCheckUserResult\n\tif err = p.Client_().Call(ctx, \"CheckUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype UserServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      UserService\n}\n\nfunc (p *UserServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *UserServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *UserServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewUserServiceProcessor(handler UserService) *UserServiceProcessor {\n\tself := &UserServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"CreateUser\", &userServiceProcessorCreateUser{handler: handler})\n\tself.AddToProcessorMap(\"MGetUser\", &userServiceProcessorMGetUser{handler: handler})\n\tself.AddToProcessorMap(\"CheckUser\", &userServiceProcessorCheckUser{handler: handler})\n\treturn self\n}\nfunc (p *UserServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype userServiceProcessorCreateUser struct {\n\thandler UserService\n}\n\nfunc (p *userServiceProcessorCreateUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := UserServiceCreateUserArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CreateUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := UserServiceCreateUserResult{}\n\tvar retval *CreateUserResp\n\tif retval, err2 = p.handler.CreateUser(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CreateUser: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CreateUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CreateUser\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype userServiceProcessorMGetUser struct {\n\thandler UserService\n}\n\nfunc (p *userServiceProcessorMGetUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := UserServiceMGetUserArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"MGetUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := UserServiceMGetUserResult{}\n\tvar retval *MGetUserResp\n\tif retval, err2 = p.handler.MGetUser(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing MGetUser: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"MGetUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"MGetUser\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype userServiceProcessorCheckUser struct {\n\thandler UserService\n}\n\nfunc (p *userServiceProcessorCheckUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := UserServiceCheckUserArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CheckUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := UserServiceCheckUserResult{}\n\tvar retval *CheckUserResp\n\tif retval, err2 = p.handler.CheckUser(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CheckUser: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CheckUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CheckUser\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype UserServiceCreateUserArgs struct {\n\tReq *CreateUserReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewUserServiceCreateUserArgs() *UserServiceCreateUserArgs {\n\treturn &UserServiceCreateUserArgs{}\n}\n\nvar UserServiceCreateUserArgs_Req_DEFAULT *CreateUserReq\n\nfunc (p *UserServiceCreateUserArgs) GetReq() (v *CreateUserReq) {\n\tif !p.IsSetReq() {\n\t\treturn UserServiceCreateUserArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *UserServiceCreateUserArgs) SetReq(val *CreateUserReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_UserServiceCreateUserArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *UserServiceCreateUserArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *UserServiceCreateUserArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCreateUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCreateUserReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceCreateUserArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUser_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceCreateUserArgs(%+v)\", *p)\n}\n\nfunc (p *UserServiceCreateUserArgs) DeepEqual(ano *UserServiceCreateUserArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceCreateUserArgs) Field1DeepEqual(src *CreateUserReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceCreateUserResult struct {\n\tSuccess *CreateUserResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewUserServiceCreateUserResult() *UserServiceCreateUserResult {\n\treturn &UserServiceCreateUserResult{}\n}\n\nvar UserServiceCreateUserResult_Success_DEFAULT *CreateUserResp\n\nfunc (p *UserServiceCreateUserResult) GetSuccess() (v *CreateUserResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn UserServiceCreateUserResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *UserServiceCreateUserResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*CreateUserResp)\n}\n\nvar fieldIDToName_UserServiceCreateUserResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *UserServiceCreateUserResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *UserServiceCreateUserResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCreateUserResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCreateUserResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceCreateUserResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUser_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceCreateUserResult(%+v)\", *p)\n}\n\nfunc (p *UserServiceCreateUserResult) DeepEqual(ano *UserServiceCreateUserResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceCreateUserResult) Field0DeepEqual(src *CreateUserResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceMGetUserArgs struct {\n\tReq *MGetUserReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewUserServiceMGetUserArgs() *UserServiceMGetUserArgs {\n\treturn &UserServiceMGetUserArgs{}\n}\n\nvar UserServiceMGetUserArgs_Req_DEFAULT *MGetUserReq\n\nfunc (p *UserServiceMGetUserArgs) GetReq() (v *MGetUserReq) {\n\tif !p.IsSetReq() {\n\t\treturn UserServiceMGetUserArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *UserServiceMGetUserArgs) SetReq(val *MGetUserReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_UserServiceMGetUserArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *UserServiceMGetUserArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *UserServiceMGetUserArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceMGetUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewMGetUserReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceMGetUserArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetUser_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceMGetUserArgs(%+v)\", *p)\n}\n\nfunc (p *UserServiceMGetUserArgs) DeepEqual(ano *UserServiceMGetUserArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceMGetUserArgs) Field1DeepEqual(src *MGetUserReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceMGetUserResult struct {\n\tSuccess *MGetUserResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewUserServiceMGetUserResult() *UserServiceMGetUserResult {\n\treturn &UserServiceMGetUserResult{}\n}\n\nvar UserServiceMGetUserResult_Success_DEFAULT *MGetUserResp\n\nfunc (p *UserServiceMGetUserResult) GetSuccess() (v *MGetUserResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn UserServiceMGetUserResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *UserServiceMGetUserResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*MGetUserResp)\n}\n\nvar fieldIDToName_UserServiceMGetUserResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *UserServiceMGetUserResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *UserServiceMGetUserResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceMGetUserResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewMGetUserResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceMGetUserResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetUser_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceMGetUserResult(%+v)\", *p)\n}\n\nfunc (p *UserServiceMGetUserResult) DeepEqual(ano *UserServiceMGetUserResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceMGetUserResult) Field0DeepEqual(src *MGetUserResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceCheckUserArgs struct {\n\tReq *CheckUserReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewUserServiceCheckUserArgs() *UserServiceCheckUserArgs {\n\treturn &UserServiceCheckUserArgs{}\n}\n\nvar UserServiceCheckUserArgs_Req_DEFAULT *CheckUserReq\n\nfunc (p *UserServiceCheckUserArgs) GetReq() (v *CheckUserReq) {\n\tif !p.IsSetReq() {\n\t\treturn UserServiceCheckUserArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *UserServiceCheckUserArgs) SetReq(val *CheckUserReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_UserServiceCheckUserArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *UserServiceCheckUserArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *UserServiceCheckUserArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCheckUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCheckUserReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceCheckUserArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUser_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceCheckUserArgs(%+v)\", *p)\n}\n\nfunc (p *UserServiceCheckUserArgs) DeepEqual(ano *UserServiceCheckUserArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceCheckUserArgs) Field1DeepEqual(src *CheckUserReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceCheckUserResult struct {\n\tSuccess *CheckUserResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewUserServiceCheckUserResult() *UserServiceCheckUserResult {\n\treturn &UserServiceCheckUserResult{}\n}\n\nvar UserServiceCheckUserResult_Success_DEFAULT *CheckUserResp\n\nfunc (p *UserServiceCheckUserResult) GetSuccess() (v *CheckUserResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn UserServiceCheckUserResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *UserServiceCheckUserResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*CheckUserResp)\n}\n\nvar fieldIDToName_UserServiceCheckUserResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *UserServiceCheckUserResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *UserServiceCheckUserResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCheckUserResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCheckUserResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceCheckUserResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUser_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceCheckUserResult(%+v)\", *p)\n}\n\nfunc (p *UserServiceCheckUserResult) DeepEqual(ano *UserServiceCheckUserResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceCheckUserResult) Field0DeepEqual(src *CheckUserResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCreateUser(ctx context.Context, req *user.CreateUserReq, callOptions ...callopt.Option) (r *user.CreateUserResp, err error)\n\tMGetUser(ctx context.Context, req *user.MGetUserReq, callOptions ...callopt.Option) (r *user.MGetUserResp, err error)\n\tCheckUser(ctx context.Context, req *user.CheckUserReq, callOptions ...callopt.Option) (r *user.CheckUserResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) CreateUser(ctx context.Context, req *user.CreateUserReq, callOptions ...callopt.Option) (r *user.CreateUserResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.CreateUser(ctx, req)\n}\n\nfunc (p *kUserServiceClient) MGetUser(ctx context.Context, req *user.MGetUserReq, callOptions ...callopt.Option) (r *user.MGetUserResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.MGetUser(ctx, req)\n}\n\nfunc (p *kUserServiceClient) CheckUser(ctx context.Context, req *user.CheckUserReq, callOptions ...callopt.Option) (r *user.CheckUserResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.CheckUser(ctx, req)\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "book-shop/kitex_gen/cwg/bookshop/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/book-shop/kitex_gen/cwg/bookshop/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"CreateUser\": kitex.NewMethodInfo(createUserHandler, newUserServiceCreateUserArgs, newUserServiceCreateUserResult, false),\n\t\t\"MGetUser\":   kitex.NewMethodInfo(mGetUserHandler, newUserServiceMGetUserArgs, newUserServiceMGetUserResult, false),\n\t\t\"CheckUser\":  kitex.NewMethodInfo(checkUserHandler, newUserServiceCheckUserArgs, newUserServiceCheckUserResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"user\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.3\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc createUserHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*user.UserServiceCreateUserArgs)\n\trealResult := result.(*user.UserServiceCreateUserResult)\n\tsuccess, err := handler.(user.UserService).CreateUser(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newUserServiceCreateUserArgs() interface{} {\n\treturn user.NewUserServiceCreateUserArgs()\n}\n\nfunc newUserServiceCreateUserResult() interface{} {\n\treturn user.NewUserServiceCreateUserResult()\n}\n\nfunc mGetUserHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*user.UserServiceMGetUserArgs)\n\trealResult := result.(*user.UserServiceMGetUserResult)\n\tsuccess, err := handler.(user.UserService).MGetUser(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newUserServiceMGetUserArgs() interface{} {\n\treturn user.NewUserServiceMGetUserArgs()\n}\n\nfunc newUserServiceMGetUserResult() interface{} {\n\treturn user.NewUserServiceMGetUserResult()\n}\n\nfunc checkUserHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*user.UserServiceCheckUserArgs)\n\trealResult := result.(*user.UserServiceCheckUserResult)\n\tsuccess, err := handler.(user.UserService).CheckUser(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newUserServiceCheckUserArgs() interface{} {\n\treturn user.NewUserServiceCheckUserArgs()\n}\n\nfunc newUserServiceCheckUserResult() interface{} {\n\treturn user.NewUserServiceCheckUserResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) CreateUser(ctx context.Context, req *user.CreateUserReq) (r *user.CreateUserResp, err error) {\n\tvar _args user.UserServiceCreateUserArgs\n\t_args.Req = req\n\tvar _result user.UserServiceCreateUserResult\n\tif err = p.c.Call(ctx, \"CreateUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) MGetUser(ctx context.Context, req *user.MGetUserReq) (r *user.MGetUserResp, err error) {\n\tvar _args user.UserServiceMGetUserArgs\n\t_args.Req = req\n\tvar _result user.UserServiceMGetUserResult\n\tif err = p.c.Call(ctx, \"MGetUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) CheckUser(ctx context.Context, req *user.CheckUserReq) (r *user.CheckUserResp, err error) {\n\tvar _args user.UserServiceCheckUserArgs\n\t_args.Req = req\n\tvar _result user.UserServiceCheckUserResult\n\tif err = p.c.Call(ctx, \"CheckUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "book-shop/licenses/LICENSE-copier.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Jinzhu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "book-shop/licenses/LICENSE-diff.txt",
    "content": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n    means each individual or legal entity that creates, contributes to\n    the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n    means the combination of the Contributions of others (if any) used\n    by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n    means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n    means Source Code Form to which the initial Contributor has attached\n    the notice in Exhibit A, the Executable Form of such Source Code\n    Form, and Modifications of such Source Code Form, in each case\n    including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n    means\n\n    (a) that the initial Contributor has attached the notice described\n        in Exhibit B to the Covered Software; or\n\n    (b) that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the\n        terms of a Secondary License.\n\n1.6. \"Executable Form\"\n    means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n    means a work that combines Covered Software with other material, in\n    a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n    means this document.\n\n1.9. \"Licensable\"\n    means having the right to grant, to the maximum extent possible,\n    whether at the time of the initial grant or subsequently, any and\n    all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n    means any of the following:\n\n    (a) any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered\n        Software; or\n\n    (b) any new file in Source Code Form that contains any Covered\n        Software.\n\n1.11. \"Patent Claims\" of a Contributor\n    means any patent claim(s), including without limitation, method,\n    process, and apparatus claims, in any patent Licensable by such\n    Contributor that would be infringed, but for the grant of the\n    License, by the making, using, selling, offering for sale, having\n    made, import, or transfer of either its Contributions or its\n    Contributor Version.\n\n1.12. \"Secondary License\"\n    means either the GNU General Public License, Version 2.0, the GNU\n    Lesser General Public License, Version 2.1, the GNU Affero General\n    Public License, Version 3.0, or any later versions of those\n    licenses.\n\n1.13. \"Source Code Form\"\n    means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n    means an individual or a legal entity exercising rights under this\n    License. For legal entities, \"You\" includes any entity that\n    controls, is controlled by, or is under common control with You. For\n    purposes of this definition, \"control\" means (a) the power, direct\n    or indirect, to cause the direction or management of such entity,\n    whether by contract or otherwise, or (b) ownership of more than\n    fifty percent (50%) of the outstanding shares or beneficial\n    ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n    Licensable by such Contributor to use, reproduce, make available,\n    modify, display, perform, distribute, and otherwise exploit its\n    Contributions, either on an unmodified basis, with Modifications, or\n    as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n    for sale, have made, import, and otherwise transfer either its\n    Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n    or\n\n(b) for infringements caused by: (i) Your and any other third party's\n    modifications of Covered Software, or (ii) the combination of its\n    Contributions with other software (except as part of its Contributor\n    Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n    its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n    Form, as described in Section 3.1, and You must inform recipients of\n    the Executable Form how they can obtain a copy of such Source Code\n    Form by reasonable means in a timely manner, at a charge no more\n    than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n    License, or sublicense it under different terms, provided that the\n    license for the Executable Form does not attempt to limit or alter\n    the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n*                                                                      *\n*  6. Disclaimer of Warranty                                           *\n*  -------------------------                                           *\n*                                                                      *\n*  Covered Software is provided under this License on an \"as is\"       *\n*  basis, without warranty of any kind, either expressed, implied, or  *\n*  statutory, including, without limitation, warranties that the       *\n*  Covered Software is free of defects, merchantable, fit for a        *\n*  particular purpose or non-infringing. The entire risk as to the     *\n*  quality and performance of the Covered Software is with You.        *\n*  Should any Covered Software prove defective in any respect, You     *\n*  (not any Contributor) assume the cost of any necessary servicing,   *\n*  repair, or correction. This disclaimer of warranty constitutes an   *\n*  essential part of this License. No use of any Covered Software is   *\n*  authorized under this License except under this disclaimer.         *\n*                                                                      *\n************************************************************************\n\n************************************************************************\n*                                                                      *\n*  7. Limitation of Liability                                          *\n*  --------------------------                                          *\n*                                                                      *\n*  Under no circumstances and under no legal theory, whether tort      *\n*  (including negligence), contract, or otherwise, shall any           *\n*  Contributor, or anyone who distributes Covered Software as          *\n*  permitted above, be liable to You for any direct, indirect,         *\n*  special, incidental, or consequential damages of any character      *\n*  including, without limitation, damages for lost profits, loss of    *\n*  goodwill, work stoppage, computer failure or malfunction, or any    *\n*  and all other commercial damages or losses, even if such party      *\n*  shall have been informed of the possibility of such damages. This   *\n*  limitation of liability shall not apply to liability for death or   *\n*  personal injury resulting from such party's negligence to the       *\n*  extent applicable law prohibits such limitation. Some               *\n*  jurisdictions do not allow the exclusion or limitation of           *\n*  incidental or consequential damages, so this exclusion and          *\n*  limitation may not apply to You.                                    *\n*                                                                      *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n  This Source Code Form is subject to the terms of the Mozilla Public\n  License, v. 2.0. If a copy of the MPL was not distributed with this\n  file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n  This Source Code Form is \"Incompatible With Secondary Licenses\", as\n  defined by the Mozilla Public License, v. 2.0."
  },
  {
    "path": "book-shop/licenses/LICENSE-elastic.txt",
    "content": "The MIT License (MIT)\nCopyright © 2012-2015 Oliver Eilhard\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the “Software”), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE."
  },
  {
    "path": "book-shop/licenses/LICENSE-gorm-mysql.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-NOW  Jinzhu <wosmvp@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "book-shop/licenses/LICENSE-gorm.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-NOW  Jinzhu <wosmvp@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "book-shop/licenses/LICENSE-redigo.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS"
  },
  {
    "path": "book-shop/licenses/LICENSE-snowflake.txt",
    "content": "Copyright (c) 2016, Bruce\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "book-shop/licenses/LICENSE-thrift.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n--------------------------------------------------\nSOFTWARE DISTRIBUTED WITH THRIFT:\n\nThe Apache Thrift software includes a number of subcomponents with\nseparate copyright notices and license terms. Your use of the source\ncode for the these subcomponents is subject to the terms and\nconditions of the following licenses.\n\n--------------------------------------------------\nPortions of the following files are licensed under the MIT License:\n\n  lib/erl/src/Makefile.am\n\nPlease see doc/otp-base-license.txt for the full terms of this license.\n\n--------------------------------------------------\nFor the aclocal/ax_boost_base.m4 and contrib/fb303/aclocal/ax_boost_base.m4 components:\n\n#   Copyright (c) 2007 Thomas Porschberg <thomas@randspringer.de>\n#\n#   Copying and distribution of this file, with or without\n#   modification, are permitted in any medium without royalty provided\n#   the copyright notice and this notice are preserved.\n\n--------------------------------------------------\nFor the lib/nodejs/lib/thrift/json_parse.js:\n\n/*\n    json_parse.js\n    2015-05-02\n    Public Domain.\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n*/\n(By Douglas Crockford <douglas@crockford.com>)\n\n--------------------------------------------------\nFor lib/cpp/src/thrift/windows/SocketPair.cpp\n\n/* socketpair.c\n * Copyright 2007 by Nathan C. Myers <ncm@cantrip.org>; some rights reserved.\n * This code is Free Software.  It may be copied freely, in original or\n * modified form, subject only to the restrictions that (1) the author is\n * relieved from all responsibilities for any use for any purpose, and (2)\n * this copyright notice must be retained, unchanged, in its entirety.  If\n * for any reason the author might be held responsible for any consequences\n * of copying or use, license is withheld.\n */\n\n\n--------------------------------------------------\nFor lib/py/compat/win32/stdint.h\n\n// ISO C9x  compliant stdint.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124\n//\n//  Copyright (c) 2006-2008 Alexander Chemeris\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//\n//   3. The name of the author may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n\n--------------------------------------------------\nCodegen template in t_html_generator.h\n\n* Bootstrap v2.0.3\n*\n* Copyright 2012 Twitter, Inc\n* Licensed under the Apache License v2.0\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Designed and built with all the love in the world @twitter by @mdo and @fat.\n\n---------------------------------------------------\nFor t_cl_generator.cc\n\n * Copyright (c) 2008- Patrick Collison <patrick@collison.ie>\n * Copyright (c) 2006- Facebook\n\n---------------------------------------------------"
  },
  {
    "path": "book-shop/pkg/conf/conf.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage conf\n\nconst (\n\tUserTableName    = \"t_user\"\n\tProductTableName = \"t_product\"\n\tOrderTableName   = \"t_order\"\n\n\tSecretKey   = \"secret key\"\n\tIdentityKey = \"id\"\n\n\tShopLoginName     = \"admin\"\n\tShopLoginPassword = \"123\"\n\n\tMySQLDefaultDSN = \"gorm:gorm@tcp(localhost:3306)/gorm?charset=utf8&parseTime=True&loc=Local\"\n\tEtcdAddress     = \"127.0.0.1:2379\"\n\tESAddress       = \"http://localhost:9200\"\n\tRedisAddress    = \"127.0.0.1:6379\"\n\n\tRedisConnPoolSize = 20\n\n\tRedisKey_User = \"user-\"\n\n\tProductESIndex = \"product\"\n\n\tUserRpcServiceName   = \"cwg.bookshop.user\"\n\tOrderRpcServiceName  = \"cwg.bookshop.order\"\n\tItemRpcServiceName   = \"cwg.bookshop.item\"\n\tUserServiceAddress   = \"127.0.0.1:8889\"\n\tOrderServiceAddress  = \"127.0.0.1:8890\"\n\tItemServiceAddress   = \"127.0.0.1:8891\"\n\tFacadeServiceAddress = \"127.0.0.1:8080\"\n)\n"
  },
  {
    "path": "book-shop/pkg/errno/errno.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage errno\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\nconst (\n\t// System Code\n\tSuccessCode    = 0\n\tServiceErrCode = 10001\n\tParamErrCode   = 10002\n\n\t// User ErrCode\n\tLoginErrCode            = 11001\n\tUserNotExistErrCode     = 11002\n\tUserAlreadyExistErrCode = 11003\n)\n\ntype ErrNo struct {\n\tErrCode int64\n\tErrMsg  string\n}\n\nfunc (e ErrNo) Error() string {\n\treturn fmt.Sprintf(\"err_code=%d, err_msg=%s\", e.ErrCode, e.ErrMsg)\n}\n\nfunc NewErrNo(code int64, msg string) ErrNo {\n\treturn ErrNo{code, msg}\n}\n\nfunc (e ErrNo) WithMessage(msg string) ErrNo {\n\te.ErrMsg = msg\n\treturn e\n}\n\nvar (\n\tSuccess             = NewErrNo(SuccessCode, \"Success\")\n\tServiceErr          = NewErrNo(ServiceErrCode, \"Service is unable to start successfully\")\n\tParamErr            = NewErrNo(ParamErrCode, \"Wrong Parameter has been given\")\n\tLoginErr            = NewErrNo(LoginErrCode, \"Wrong username or password\")\n\tUserNotExistErr     = NewErrNo(UserNotExistErrCode, \"User does not exists\")\n\tUserAlreadyExistErr = NewErrNo(UserAlreadyExistErrCode, \"User already exists\")\n)\n\n// ConvertErr convert error to Errno\nfunc ConvertErr(err error) ErrNo {\n\tErr := ErrNo{}\n\tif errors.As(err, &Err) {\n\t\treturn Err\n\t}\n\n\ts := ServiceErr\n\ts.ErrMsg = err.Error()\n\treturn s\n}\n"
  },
  {
    "path": "book-shop/pkg/errno/resp.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage errno\n\nimport (\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/book-shop/kitex_gen/base\"\n)\n\n// BuildBaseResp build baseResp from error\nfunc BuildBaseResp(err error) *base.BaseResp {\n\tif err == nil {\n\t\treturn baseResp(Success)\n\t}\n\n\te := ErrNo{}\n\tif errors.As(err, &e) {\n\t\treturn baseResp(e)\n\t}\n\n\ts := ServiceErr.WithMessage(err.Error())\n\treturn baseResp(s)\n}\n\nfunc baseResp(err ErrNo) *base.BaseResp {\n\treturn &base.BaseResp{StatusCode: int32(err.ErrCode), StatusMessage: err.ErrMsg}\n}\n"
  },
  {
    "path": "book-shop/pkg/utils/idgen.go",
    "content": "// Copyright 2023 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage utils\n\nimport (\n\t\"github.com/bwmarrin/snowflake\"\n)\n\nfunc GenerateID() (int64, error) {\n\tnode, err := snowflake.NewNode(1)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tid := node.Generate().Int64()\n\treturn id, nil\n}\n"
  },
  {
    "path": "book-shop/pkg/utils/logutil.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage utils\n\nimport (\n\t\"strings\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype Level string\n\nconst (\n\tLevelTrace  Level = \"trace\"\n\tLevelDebug  Level = \"debug\"\n\tLevelInfo   Level = \"info\"\n\tLevelNotice Level = \"notice\"\n\tLevelWarn   Level = \"warn\"\n\tLevelError  Level = \"error\"\n\tLevelFatal  Level = \"fatal\"\n)\n\n// KitexLogLevel return kitex log level\nfunc (level Level) KitexLogLevel() klog.Level {\n\tl := Level(strings.ToLower(string(level)))\n\tswitch l {\n\tcase LevelTrace:\n\t\treturn klog.LevelTrace\n\tcase LevelDebug:\n\t\treturn klog.LevelDebug\n\tcase LevelInfo:\n\t\treturn klog.LevelInfo\n\tcase LevelNotice:\n\t\treturn klog.LevelNotice\n\tcase LevelWarn:\n\t\treturn klog.LevelWarn\n\tcase LevelError:\n\t\treturn klog.LevelError\n\tcase LevelFatal:\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelTrace\n\t}\n}\n"
  },
  {
    "path": "bookinfo/Makefile",
    "content": "# The old school Makefile, following are required targets. The Makefile is written\n# to allow building multiple binaries. You are free to add more targets or change\n# existing implementations, as long as the semantics are preserved.\n#\n#   make              - default to 'build' target\n#   make lint         - code analysis\n#   make test         - run unit test (or plus integration test)\n#   make build        - alias to build-local target\n#   make build-local  - build local binary targets\n#   make build-linux  - build linux binary targets\n#   make container    - build containers\n#   $ docker login registry -u username -p xxxxx\n#   make push         - push containers\n#   make clean        - clean up targets\n#\n# Not included but recommended targets:\n#   make e2e-test\n#\n# The makefile is also responsible to populate project version information.\n#\n\n#\n# Tweak the variables based on your project.\n#\n\n# This repo's root import path (under GOPATH).\nROOT := github.com/cloudwego/biz-demo/bookinfo\n\n# Module name.\nNAME := bookinfo\n\n# Container image prefix and suffix added to targets.\n# The final built images are:\n#   $[REGISTRY]/$[IMAGE_PREFIX]$[TARGET]$[IMAGE_SUFFIX]:$[VERSION]\n# $[REGISTRY] is an item from $[REGISTRIES], $[TARGET] is an item from $[TARGETS].\nIMAGE_PREFIX ?= $(strip )\nIMAGE_SUFFIX ?= $(strip )\n\n# Container registries.\nREGISTRY ?= cr-cn-beijing.volces.com/coa-samples\n\n# Container registry for base images.\nBASE_REGISTRY ?= cr-cn-beijing.volces.com/coa-samples\n\n# Helm chart repo\nCHART_REPO ?= charts\n\n#\n# These variables should not need tweaking.\n#\n\n# It's necessary to set this because some environments don't link sh -> bash.\nexport SHELL := /bin/bash\n\n# It's necessary to set the errexit flags for the bash shell.\nexport SHELLOPTS := errexit\n\n# Project main package location.\nCMD_DIR := ./cmd\n\n# Project output directory.\nOUTPUT_DIR := ./bin\n\n# Build directory.\nBUILD_DIR := ./build\n\nIMAGE_NAME := $(IMAGE_PREFIX)$(NAME)$(IMAGE_SUFFIX)\n\n# Current version of the project.\nGOCOMMON     := $(shell if [ ! -f go.mod ]; then echo $(ROOT)/vendor/; fi)github.com/cloudwego/biz-demo/bookinfo\n#VERSION      ?= $(shell git describe --tags --always --dirty)\nBRANCH       ?= $(shell git branch | grep \\* | cut -d ' ' -f2)\nGITCOMMIT    ?= $(shell git rev-parse HEAD)\nGITTREESTATE ?= $(if $(shell git status --porcelain),dirty,clean)\nBUILDDATE    ?= $(shell date -u +\"%Y-%m-%dT%H:%M:%SZ\")\nVERSION      ?= latest\nappVersion   ?= $(VERSION)\n\n# Available cpus for compiling, please refer to https://github.com/caicloud/engineering/issues/8186#issuecomment-518656946 for more information.\nCPUS ?= $(shell /bin/bash hack/read_cpus_available.sh)\n\n# Track code version with Docker Label.\nDOCKER_LABELS ?= git-describe=\"$(shell date -u +v%Y%m%d)-$(shell git describe --tags --always --dirty)\"\n\n# Golang standard bin directory.\nGOPATH ?= $(shell go env GOPATH)\nBIN_DIR := $(GOPATH)/bin\nGOLANGCI_LINT := $(BIN_DIR)/golangci-lint\nHELM_LINT := /usr/local/bin/helm\nNIRVANA := $(OUTPUT_DIR)/nirvana\n\n# Default golang flags used in build and test\n# -mod=vendor: force go to use the vendor files instead of using the `$GOPATH/pkg/mod`\n# -p: the number of programs that can be run in parallel\n# -count: run each test and benchmark 1 times. Set this flag to disable test cache\nexport GOFLAGS ?= -count=1\n\n#\n# Define all targets. At least the following commands are required:\n#\n\n# All targets.\n.PHONY: lint test build container push\n\nbuild: build-local\n\n# more info about `GOGC` env: https://github.com/golangci/golangci-lint#memory-usage-of-golangci-lint\nlint: $(GOLANGCI_LINT) $(HELM_LINT)\n\t@$(GOLANGCI_LINT) run\n\t@bash hack/helm-lint.sh\n\n$(GOLANGCI_LINT):\n\tcurl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(BIN_DIR) v1.23.6\n\n$(HELM_LINT):\n\tcurl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | sudo bash\n\ntest:\n\t@go test -race -coverprofile=coverage.out ./...\n\t@go tool cover -func coverage.out | tail -n 1 | awk '{ print \"Total coverage: \" $$3 }'\n\nbuild-local:\n\t@go build -v -o $(OUTPUT_DIR)/$(NAME)                                  \\\n\t  -ldflags \"-s -w -X $(GOCOMMON)/version.module=$(NAME)                \\\n\t    -X $(GOCOMMON)/version.version=$(VERSION)                          \\\n\t    -X $(GOCOMMON)/version.branch=$(BRANCH)                            \\\n\t    -X $(GOCOMMON)/version.gitCommit=$(GITCOMMIT)                      \\\n\t    -X $(GOCOMMON)/version.gitTreeState=$(GITTREESTATE)                \\\n\t    -X $(GOCOMMON)/version.buildDate=$(BUILDDATE)\"                     \\\n\t  $(CMD_DIR);\n\nbuild-linux:\n\t/bin/bash -c 'GOOS=linux GOARCH=amd64 GOPATH=/go GOFLAGS=\"$(GOFLAGS)\"  \\\n\t  go build -v -o $(OUTPUT_DIR)/$(NAME)                                 \\\n\t    -ldflags \"-s -w -X $(GOCOMMON)/version.module=$(NAME)              \\\n\t      -X $(GOCOMMON)/version.version=$(VERSION)                        \\\n\t      -X $(GOCOMMON)/version.branch=$(BRANCH)                          \\\n\t      -X $(GOCOMMON)/version.gitCommit=$(GITCOMMIT)                    \\\n\t      -X $(GOCOMMON)/version.gitTreeState=$(GITTREESTATE)              \\\n\t      -X $(GOCOMMON)/version.buildDate=$(BUILDDATE)\"                   \\\n\t\t$(CMD_DIR)'\n\ncontainer:\n\t@docker build -t $(REGISTRY)/$(IMAGE_NAME):$(VERSION)                  \\\n\t  --label $(DOCKER_LABELS)                                             \\\n\t  -f $(BUILD_DIR)/Dockerfile .;\n\npush: container\n\t@docker push $(REGISTRY)/$(IMAGE_NAME):$(VERSION);\n\n.PHONY: clean\nclean:\n\t@-rm -vrf ${OUTPUT_DIR}\n\n.PHONY: convert-images update-chart-version push-chart\nconvert-images: lint\n\t@find manifests -type f | sed -n 's/Chart.yaml//p' \\\n\t| xargs -L1 helm template --set platformConfig.imageRegistry=REGISTRY_DOMAIN \\\n\t| grep -Eo \"REGISTRY_DOMAIN/.*:.*\" | sed \"s/^REGISTRY_DOMAIN\\///g\" \\\n\t| tr -d \"[:blank:],']{}\\`\\\"\" | sort -n | uniq\n\t@find manifests -type f -name \"images*.list\" | xargs cat | sort -n | uniq\n\n# Update all addons Chart.yaml version and appVersion\nupdate-chart-version:\n\t@find manifests -maxdepth 2 -type f -name 'Chart.yaml' \\\n\t| xargs -L1 sed -i- \"s|^version: .*|version: $(VERSION)|;s|^appVersion: .*|appVersion: $(appVersion)|\"\n\t@find manifests -maxdepth 2 -type f -name 'Chart.yaml-' | xargs rm -f\n\npush-chart:\n\t@find manifests -maxdepth 1 -mindepth 1 -type d -exec helm push {} $(CHART_REPO) \\;\n\n.PHONY: kitex\nkitex:\n\t@rm -rf kitex_gen/\n\t@kitex -module $(ROOT) ./idl/productpage.thrift\n\t@kitex -module $(ROOT) ./idl/reviews.thrift\n\t@kitex -module $(ROOT) ./idl/ratings.thrift\n\t@kitex -module $(ROOT) ./idl/details.thrift\n\nrun-server: build-local\n\t@bash hack/run_server.sh\n\nrun-measure: build-local\n\t@bash hack/run_measure.sh\n\nrun-side-server: kitex build-local\n\t@bash hack/run_side_server.sh\n\ncontainer-multi-arch:\n\t   @docker buildx build -t $(REGISTRY)/$(IMAGE_NAME):$(VERSION)           \\\n         --label $(DOCKER_LABELS)                                             \\\n         --platform=linux/arm64,linux/amd64                                   \\\n         -f $(BUILD_DIR)/Dockerfile.multiarch . --push;\n\n\n"
  },
  {
    "path": "bookinfo/README.md",
    "content": "# Bookinfo\n\n> Rewrite **[Bookinfo](https://istio.io/latest/docs/examples/bookinfo/)** project using `hertz`, `kitex`\n\n## Architecture\n![img.png](./docs/bookinfo-arch.svg)\n\n## Lane\n![lane.png](./docs/lane.svg)\n\n## QuickStart\n\n### Prerequisites\n#### Kubernetes cluster\n> If you don't have an existing K8S cluster, you can use minikube to quickly launch one\n\n1. install [minikube](https://minikube.sigs.k8s.io/docs/start/)\n2. `minikube start`\n\n#### Istio\nRefer to [the doc of Istio](https://istio.io/latest/docs/setup/install/istioctl/) to deploy a set of istio to the K8S cluster\n\n#### Helm\nRefer to [the doc of Helm](https://helm.sh/docs/intro/install/) to install the helm command-line tool\n\n#### OpenTelemetry\n\n##### install opentelemetry operator\n```bash\nhelm install --set admissionWebhooks.certManager.enabled=false \\\n  opentelemetry-operator open-telemetry/opentelemetry-operator\n```\n\n##### deploy opentelemetry collector\nWe are here just for demo, so we will only export spans and metrics to the log. For the production environment, set up your opentelemetry-collector as needed\n```shell\nkubectl apply -f - <<EOF\napiVersion: opentelemetry.io/v1alpha1\nkind: OpenTelemetryCollector\nmetadata:\n  name: bookinfo-demo\nspec:\n  mode: statefulset\n  replicas: 3\n  config: |\n    receivers:\n      otlp:\n        protocols:\n          grpc:\n    processors:\n\n    exporters:\n      logging:\n\n    service:\n      pipelines:\n        traces:\n          receivers: [otlp]\n          processors: []\n          exporters: [logging]\n        metrics:\n          receivers: [otlp]\n          processors: []\n          exporters: [logging]          \nEOF\n```\n\n### Deploy Bookinfo Application\n```bash\nhelm install bookinfo ./manifest/bookinfo/workloads\n```\nAfter successful deploy, you can see that the pods are running：\n\n![img.png](docs/pods.png)\n\n### Expose Bookinfo by Istio Ingress Gateway\n```bash\nkubectl apply -f bookinfo/manifest/bookinfo/traffic/bookinfo-gateway.yaml\n```\nUse the minikube tunnel feature to assign LB IPs to istio ingress:\n```bash\nminikube tunnel\n```\nThen you can request the address on the command line\n```shell\ncurl http://localhost/api/v1/products/1\n```\nYou see the following output, indicating that the deployment was successful!\n```json\n{\"ID\":\"1\",\"Title\":\"《Also sprach Zarathustra》\",\"Author\":\"Friedrich Nietzsche\",\"Description\":\"Thus Spoke Zarathustra: A Book for All and None, also translated as Thus Spake Zarathustra, is a work of philosophical fiction written by German philosopher Friedrich Nietzsche between 1883 and 1885.\",\"Rating\":0}\n```\n\n## Traffic routing example\n\n#### Define routing rules\n\n```yaml\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n    - reviews\n  http:\n    - match:\n        - headers:\n            baggage:\n              exact: \"env=dev\"\n      route:\n        - destination:\n            host: reviews\n            subset: v2\n          weight: 100\n    - route:\n        - destination:\n            host: reviews\n            subset: v1\n          weight: 80\n        - destination:\n            host: reviews\n            subset: v3\n          weight: 20\n\n---\n\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: ratings\nspec:\n  hosts:\n    - ratings\n  http:\n    - match:\n        - headers:\n            baggage:\n              exact: \"env=dev\"\n      route:\n        - destination:\n            host: ratings\n            subset: v2\n          weight: 100\n    - route:\n        - destination:\n            host: ratings\n            subset: v1\n          weight: 100\n```\n\n#### Request base lane service, rating `0` or `1` randomly\n![bookinfo_1.png](docs/bookinfo_rating_1.jpeg)\n![bookinfo_2.png](docs/bookinfo_without_rating.jpeg)\n\n#### Set the request coloring flag through the browser mod-header plugin\n![bookinfo_3.png](docs/bookinfo_header.png)\n\n#### Click the refresh button again, you can find that the request hits the branch lane, and the rating becomes `5`\n![bookinfo_4.png](docs/bookinfo_canary.jpeg)\n\n\n### View Tracing\n![tracing-topo](docs/coa-tracing-topo.png)\n![tracing](docs/coa-tracing.png)\n\n### View Topology\n![operation-topo](docs/upstream-operation-topo.png)\n"
  },
  {
    "path": "bookinfo/README_CN.md",
    "content": "# Bookinfo\n\n> Rewrite **[Bookinfo](https://istio.io/latest/docs/examples/bookinfo/)** project using `hertz`, `kitex`\n\n## 架构\n\n![img.png](./docs/bookinfo-arch.png)\n\n## 泳道示意图\n![lane.png](./docs/lane.png)\n\n## 快速开始\n\n### 前置条件\n#### Kubernetes 集群\n> 如果你还没有已存在的 K8S 集群，可以用 `minikube` 快速启动一个\n\n1. 安装 [minikube](https://minikube.sigs.k8s.io/docs/start/)\n2. `minikube start`\n\n#### Istio\n参考 [Istio 文档](https://istio.io/latest/docs/setup/install/istioctl/) 部署一套 Istio 到集群中\n\n#### Helm\n参考[Helm 文档](https://helm.sh/docs/intro/install/) 安装 Helm 工具\n\n#### OpenTelemetry\n\n##### 安装 opentelemetry operator\n```bash\nhelm install --set admissionWebhooks.certManager.enabled=false \\\n  opentelemetry-operator open-telemetry/opentelemetry-operator\n```\n\n##### 部署 opentelemetry collector\n我们在这里只是为了演示，所以我们只会将 Spans 和 Metrics 直接输出到日志中中。对于生产环境，请根据你的需求来设置 `OpenTelemetryCollector`\n```shell\nkubectl apply -f - <<EOF\napiVersion: opentelemetry.io/v1alpha1\nkind: OpenTelemetryCollector\nmetadata:\n  name: bookinfo-demo\nspec:\n  mode: statefulset\n  replicas: 3\n  config: |\n    receivers:\n      otlp:\n        protocols:\n          grpc:\n    processors:\n\n    exporters:\n      logging:\n\n    service:\n      pipelines:\n        traces:\n          receivers: [otlp]\n          processors: []\n          exporters: [logging]\n        metrics:\n          receivers: [otlp]\n          processors: []\n          exporters: [logging]          \nEOF\n```\n\n### 部署 Bookinfo Application\n```bash\nhelm install bookinfo ./manifest/bookinfo/workloads\n```\n成功部署之后，你会看到这些 `pods` 处于 `running` 状态：\n\n![img.png](docs/pods.png)\n\n### 通过 Istio Ingress Gateway 暴露 Bookinfo \n```bash\nkubectl apply -f bookinfo/manifest/bookinfo/traffic/bookinfo-gateway.yaml\n```\n借助 minikube tunnel 功能来为 istio ingress gateway 分配 LB IP:\n```bash\nminikube tunnel\n```\n在命令行中请求该地址：\n```shell\ncurl http://localhost/api/v1/products/1\n```\n你如果看到以下输出，说明部署成功了！\n```json\n{\"ID\":\"1\",\"Title\":\"《Also sprach Zarathustra》\",\"Author\":\"Friedrich Nietzsche\",\"Description\":\"Thus Spoke Zarathustra: A Book for All and None, also translated as Thus Spake Zarathustra, is a work of philosophical fiction written by German philosopher Friedrich Nietzsche between 1883 and 1885.\",\"Rating\":0}\n```\n\n## 流量路由示例\n\n#### 定义路由规则\n\n```yaml\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n    - reviews\n  http:\n    - match:\n        - headers:\n            baggage:\n              exact: \"env=dev\"\n      route:\n        - destination:\n            host: reviews\n            subset: v2\n          weight: 100\n    - route:\n        - destination:\n            host: reviews\n            subset: v1\n          weight: 80\n        - destination:\n            host: reviews\n            subset: v3\n          weight: 20\n\n---\n\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: ratings\nspec:\n  hosts:\n    - ratings\n  http:\n    - match:\n        - headers:\n            baggage:\n              exact: \"env=dev\"\n      route:\n        - destination:\n            host: ratings\n            subset: v2\n          weight: 100\n    - route:\n        - destination:\n            host: ratings\n            subset: v1\n          weight: 100\n```\n\n#### 请求基准泳道服务，评分为 0 或 1 随机\n![bookinfo_1.png](docs/bookinfo_rating_1.png)\n![bookinfo_2.png](docs/bookinfo_without_rating.png)\n\n#### 通过浏览器 mod-header 插件，设置灰度标识 header\n![bookinfo_3.png](docs/bookinfo_header.png)\n\n#### 再点击刷新按钮，可以发现请求打到了分支泳道\n![bookinfo_4.png](docs/bookinfo_canary.png)\n\n\n### 查看 Tracing \n![tracing-topo](docs/coa-tracing-topo.png)\n![tracing](docs/coa-tracing.png)\n\n### 查看拓扑\n![operation-topo](docs/upstream-operation-topo.png)"
  },
  {
    "path": "bookinfo/build/Dockerfile",
    "content": "FROM golang:1.18 as builder\n\nENV GO111MODULE=on \\\n    GOPROXY=https://goproxy.cn,direct\n\nCOPY . /go/src/github.com/cloudwego/biz-demo/bookinfo\nWORKDIR /go/src/github.com/cloudwego/biz-demo/bookinfo\n\nRUN make build-linux\n\nFROM nicolaka/netshoot\nRUN mkdir -p /app && \\\n    chown -R nobody:nogroup /app\nCOPY --from=builder /go/src/github.com/cloudwego/biz-demo/bookinfo/bin/bookinfo /app\nCOPY --from=builder /go/src/github.com/cloudwego/biz-demo/bookinfo/conf /app/conf\n\nUSER        nobody\nWORKDIR     /app\nENV         PSM=cwg.bizdemo.bookinfo HERTZ_CONF_DIR=conf HERTZ_LOG_DIR=output/log\nENTRYPOINT  [\"/app/bookinfo\"]\n"
  },
  {
    "path": "bookinfo/cmd/details/cmd.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage details\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/server/details\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc NewCommand() *cobra.Command {\n\treturn &cobra.Command{\n\t\tUse:   \"details\",\n\t\tShort: \"start details server\",\n\t\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\t\tctx, cancel := context.WithCancel(context.Background())\n\t\t\tdefer cancel()\n\n\t\t\tserver, err := details.NewServer(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn server.Run(ctx)\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "bookinfo/cmd/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\tgoflag \"flag\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/cmd/details\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/cmd/productpage\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/cmd/ratings\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/cmd/reviews\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/version\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/spf13/cobra\"\n)\n\n// Runnable server interface\ntype Runnable interface {\n\tRun(ctx context.Context)\n}\n\nvar (\n\tmoduleName = version.Get().Module\n\trootCmd    = &cobra.Command{\n\t\tUse:   moduleName,\n\t\tShort: fmt.Sprintf(\"%s module\", moduleName),\n\t}\n)\n\nfunc main() {\n\trootCmd.PersistentFlags().AddGoFlagSet(goflag.CommandLine)\n\trootCmd.AddCommand(\n\t\tproductpage.NewCommand(),\n\t\treviews.NewCommand(),\n\t\tratings.NewCommand(),\n\t\tdetails.NewCommand(),\n\t)\n\n\tconfigparser.Flags(rootCmd.PersistentFlags())\n\tif err := rootCmd.Execute(); err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "bookinfo/cmd/productpage/cmd.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage productpage\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/server/productpage\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc NewCommand() *cobra.Command {\n\treturn &cobra.Command{\n\t\tUse:   \"productpage\",\n\t\tShort: \"start productpage server\",\n\t\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\t\tctx, cancel := context.WithCancel(context.Background())\n\t\t\tdefer cancel()\n\n\t\t\tserver, err := productpage.NewServer(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn server.Run(ctx)\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "bookinfo/cmd/ratings/cmd.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage ratings\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/server/ratings\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc NewCommand() *cobra.Command {\n\treturn &cobra.Command{\n\t\tUse:   \"ratings\",\n\t\tShort: \"start ratings server\",\n\t\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\t\tctx, cancel := context.WithCancel(context.Background())\n\t\t\tdefer cancel()\n\n\t\t\tserver, err := ratings.NewServer(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn server.Run(ctx)\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "bookinfo/cmd/reviews/cmd.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage reviews\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/server/reviews\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc NewCommand() *cobra.Command {\n\treturn &cobra.Command{\n\t\tUse:   \"reviews\",\n\t\tShort: \"start reviews server\",\n\t\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\t\tctx, cancel := context.WithCancel(context.Background())\n\t\t\tdefer cancel()\n\n\t\t\tserver, err := reviews.NewServer(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn server.Run(ctx)\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "bookinfo/conf/details.yaml",
    "content": "server:\n  addr: 0.0.0.0:8084\n  logLevel: debug\n"
  },
  {
    "path": "bookinfo/conf/productpage.yaml",
    "content": "server:\n  addr: 0.0.0.0:8081\n  logLevel: debug\nreviews:\n#  endpoint: reviews.default.svc.cluster.local:8082\n  endpoint: :8082\n  xdsAddr: :15010\n#  enableXDS: true\ndetails:\n  endpoint: :8084"
  },
  {
    "path": "bookinfo/conf/ratings.yaml",
    "content": "server:\n  addr: 0.0.0.0:8083\n  logLevel: debug\n"
  },
  {
    "path": "bookinfo/conf/reviews.yaml",
    "content": "server:\n  addr: 0.0.0.0:8082\n  logLevel: debug\nratings:\n  endpoint: :8083"
  },
  {
    "path": "bookinfo/go.mod",
    "content": "module github.com/cloudwego/biz-demo/bookinfo\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.16.0\n\tgithub.com/bytedance/gopkg v0.1.1\n\tgithub.com/cloudwego/hertz v0.9.5\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/google/wire v0.5.0\n\tgithub.com/hertz-contrib/obs-opentelemetry/tracing v0.4.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.7\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20230219092456-5e6c84962323\n\tgithub.com/kitex-contrib/xds v0.4.2\n\tgithub.com/spf13/cobra v1.5.0\n\tgithub.com/spf13/pflag v1.0.5\n\tgithub.com/spf13/viper v1.13.0\n\tgo.opentelemetry.io/otel v1.20.0\n\tgolang.org/x/sync v0.16.0\n)\n\nrequire (\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/census-instrumentation/opencensus-proto v0.4.1 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/envoyproxy/go-control-plane v0.11.1 // indirect\n\tgithub.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.6.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect\n\tgithub.com/hashicorp/hcl v1.0.0 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.0.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/magiconair/properties v1.8.6 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.1.6 // indirect\n\tgithub.com/pelletier/go-toml v1.9.5 // indirect\n\tgithub.com/pelletier/go-toml/v2 v2.0.5 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/sirupsen/logrus v1.8.1 // indirect\n\tgithub.com/spf13/afero v1.9.2 // indirect\n\tgithub.com/spf13/cast v1.5.0 // indirect\n\tgithub.com/spf13/jwalterweatherman v1.1.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/subosito/gotenv v1.4.1 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.20.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/atomic v1.11.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.31.0 // indirect\n\tgopkg.in/ini.v1 v1.67.0 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "bookinfo/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ncloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bytedance/gopkg v0.0.0-20210705062217-74c74ebadcae/go.mod h1:birsdqRCbwnckJbdAvcSao+AzOyibVEoWB55MjpYpB8=\ngithub.com/bytedance/gopkg v0.0.0-20210910103821-e4efae9c17c3/go.mod h1:birsdqRCbwnckJbdAvcSao+AzOyibVEoWB55MjpYpB8=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.12 h1:aeszOmGw8CPX8CRx1DZ/Glzb1yXvhjDh6jdFBNZjsU4=\ngithub.com/bytedance/mockey v1.2.12/go.mod h1:3ZA4MQasmqC87Tw0w7Ygdy7eHIc2xgpZ8Pona5rsYIk=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g=\ngithub.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=\ngithub.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/choleraehyq/pid v0.0.12/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.9.5 h1:FXV2YFLrNHRdpwT+OoIvv0wEHUC0Bo68CDPujr6VnWo=\ngithub.com/cloudwego/hertz v0.9.5/go.mod h1:UUBt8N8hSTStz7NEvLZ5mnALpBSofNL4DoYzIIp8UaY=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.2.0/go.mod h1:1p4rtGIIiFZMOePYbSPgLkIhdhdfhEtVOJSti/k9vK4=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.1.0/go.mod h1:rZOiNI0FYjuvNybXKKhAPUja03loJi/cdv2F55AE6E8=\ngithub.com/cloudwego/netpoll v0.2.0/go.mod h1:rZOiNI0FYjuvNybXKKhAPUja03loJi/cdv2F55AE6E8=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/netpoll-http2 v0.0.6/go.mod h1:+bjPyu2Cd4GDzKa0IegPgp1hjMjpZ6/kXTsSjIsmUk8=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k=\ngithub.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM=\ngithub.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=\ngithub.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=\ngithub.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=\ngithub.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=\ngithub.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=\ngithub.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=\ngithub.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.4.1 h1:YOv/UcSHjeAg1CwvcXi1zsNz5xFKf1iAKlEKAt7k31I=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.4.1/go.mod h1:u+EVWM4dDcudoXY4bCia0EyhaBOsPgRah+FvM75DM7s=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.7 h1:at3LBOR6n2QPzP6UyASBUJUte/1bThoVAGx9SbTte2c=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.7/go.mod h1:D/MrXWtvZY5ZeNxw8KWx+da8g17N5aT0CkedbUzvmGE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20230219092456-5e6c84962323 h1:hwJsa1WoC28vzzQiE5H1Pvdd7DjO99zpxUoh7B41lDA=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20230219092456-5e6c84962323/go.mod h1:Eml/0Z+CqgGIPf9JXzLGu+N9NJoy2x5pqypN+hmKArE=\ngithub.com/kitex-contrib/xds v0.4.2 h1:yA/EQ1D/qTJWdy/1w/OWs0No9Greu0yUUzRqMIfltMM=\ngithub.com/kitex-contrib/xds v0.4.2/go.mod h1:mDEfblTDqJF9DtOke9pFyYza7jVMj07FxYqNMO3BvkA=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=\ngithub.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.1.6 h1:DcueYq7QrOArAprAYNoQfDgp0KetO4LqtnBtQC6Wyes=\ngithub.com/nyaruka/phonenumbers v1.1.6/go.mod h1:yShPJHDSH3aTKzCbXyVxNpbl2kA+F+Ne5Pun/MvFRos=\ngithub.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=\ngithub.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=\ngithub.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=\ngithub.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=\ngithub.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=\ngithub.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=\ngithub.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=\ngithub.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=\ngithub.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=\ngithub.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=\ngithub.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=\ngithub.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=\ngithub.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=\ngithub.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=\ngithub.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=\ngithub.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU=\ngithub.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=\ngithub.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4=\ngo.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc=\ngo.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I=\ngo.opentelemetry.io/otel/exporters/prometheus v0.43.0 h1:Skkl6akzvdWweXX6LLAY29tyFSO6hWZ26uDbVGTDXe8=\ngo.opentelemetry.io/otel/exporters/prometheus v0.43.0/go.mod h1:nZStMoc1H/YJpRjSx9IEX4abBMekORTLQcTUT1CgLkg=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.4.1/go.mod h1:BFiGsTMZdqtxufux8ANXuMeRz9dMPVFdJZadUWDFD7o=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.20.0 h1:4s9HxB4azeeQkhY0GE5wZlMj4/pz8tE5gx2OQpGUw58=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.20.0/go.mod h1:djVA3TUJ2fSdMX0JE5XxFBOaZzprElJoP7fD4vnV2SU=\ngo.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA=\ngo.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM=\ngo.opentelemetry.io/otel/sdk v1.4.1/go.mod h1:NBwHDgDIBYjwK2WNu1OPgsIc2IJzmBXNnvIJxJc8BpE=\ngo.opentelemetry.io/otel/sdk v1.20.0 h1:5Jf6imeFZlZtKv9Qbo6qt2ZkmWtdWx/wzcCbNUlAWGM=\ngo.opentelemetry.io/otel/sdk v1.20.0/go.mod h1:rmkSx1cZCm/tn16iWDn1GQbLtsW/LvsdEEFzCSRM6V0=\ngo.opentelemetry.io/otel/sdk/metric v1.20.0 h1:5eD40l/H2CqdKmbSV7iht2KMK0faAIL2pVYzJOWobGk=\ngo.opentelemetry.io/otel/sdk/metric v1.20.0/go.mod h1:AGvpC+YF/jblITiafMTYgvRBUiwi9hZf0EYE2E5XlS8=\ngo.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc=\ngo.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ=\ngo.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=\ngo.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=\ngo.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=\ngo.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=\ngolang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210415045647-66c3f260301c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8=\ngoogle.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=\ngoogle.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=\ngopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "bookinfo/idl/base.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\nnamespace go base\n\nstruct BaseResp {\n    1: string StatusMessage = \"\",\n    2: i32 StatusCode = 0,\n    3: optional map<string, string> Extra,\n}"
  },
  {
    "path": "bookinfo/idl/details.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\ninclude \"base.thrift\"\nnamespace go cwg.bookinfo.details\n\n\nstruct Product {\n    1: required string ID,\n    2: required string Title,\n    3: required string Author,\n    4: required string Description,\n}\n\nstruct GetProductReq {\n    1: required string ID,\n}\n\nstruct GetProductResp {\n    1: required Product Product,\n}\n\nservice DetailsService {\n    GetProductResp GetProduct(1: GetProductReq req)\n}\n"
  },
  {
    "path": "bookinfo/idl/productpage.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\ninclude \"base.thrift\"\nnamespace go cwg.bookinfo.product\n\nstruct Product {\n    1: required string ID,\n    2: required string Title,\n    3: required string Author,\n    4: required string Description,\n    5: required i8 Rating,\n}\n\nstruct GetProductReq {\n    1: required string ID,\n}\n\nstruct GetProductResp {\n    1: required Product Product,\n}\n\nstruct ListProductsReq {\n}\n\nstruct ListProductsResp {\n    1: required list<Product> Items,\n    255: base.BaseResp BaseResp,\n}\n\nservice ProductPageService {\n    GetProductResp GetProduct(1: GetProductReq req)\n    ListProductsResp ListProducts(1: ListProductsReq req)\n}\n\n\n\n"
  },
  {
    "path": "bookinfo/idl/ratings.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\ninclude \"base.thrift\"\nnamespace go cwg.bookinfo.ratings\n\n\nstruct RatingReq {\n    1: required string ProductID,\n}\n\nstruct RatingResp {\n    1: required i8 Rating,\n}\n\nservice RatingService {\n    RatingResp ratings(1: RatingReq req)\n}\n"
  },
  {
    "path": "bookinfo/idl/reviews.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\ninclude \"base.thrift\"\nnamespace go cwg.bookinfo.reviews\n\nenum ReviewType {\n    Local,\n    Blue,\n    Green\n}\n\nstruct Review {\n    1: required ReviewType Type,\n    2: required i8 Rating,\n}\n\nstruct ReviewReq {\n    1: required string ProductID,\n}\n\nstruct ReviewResp {\n    1: required Review Review,\n}\n\nservice ReviewsService{\n    ReviewResp ReviewProduct(1: ReviewReq req)\n}"
  },
  {
    "path": "bookinfo/internal/handler/productpage/product.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage productpage\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/base\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details/detailsservice\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/product\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews/reviewsservice\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"golang.org/x/sync/errgroup\"\n)\n\n// Handler productpage hertz handler\ntype Handler struct {\n\treviewsClient reviewsservice.Client\n\tdetailsClient detailsservice.Client\n}\n\n// New create handler\nfunc New(reviewsClient reviewsservice.Client, detailsClient detailsservice.Client) *Handler {\n\treturn &Handler{reviewsClient: reviewsClient, detailsClient: detailsClient}\n}\n\n// GetProduct get product info\nfunc (h *Handler) GetProduct(ctx context.Context, c *app.RequestContext) {\n\tproductID := c.Param(\"productID\")\n\n\tvar (\n\t\treviewsResp *reviews.ReviewResp\n\t\tdetailsResp *details.GetProductResp\n\t)\n\n\teg, ctx := errgroup.WithContext(ctx)\n\n\teg.Go(func() error {\n\t\tres, err := h.reviewsClient.ReviewProduct(ctx, &reviews.ReviewReq{ProductID: productID})\n\t\tif err != nil {\n\t\t\tklog.CtxErrorf(ctx, \"call reviews error: %s\", err.Error())\n\t\t\treturn err\n\t\t}\n\t\treviewsResp = res\n\t\treturn nil\n\t})\n\n\teg.Go(func() error {\n\t\tres, err := h.detailsClient.GetProduct(ctx, &details.GetProductReq{ID: productID})\n\t\tif err != nil {\n\t\t\tklog.CtxErrorf(ctx, \"call details error: %s\", err.Error())\n\t\t\treturn err\n\t\t}\n\n\t\tdetailsResp = res\n\t\treturn nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, &base.BaseResp{\n\t\t\tStatusMessage: \"internal error\",\n\t\t\tStatusCode:    http.StatusInternalServerError,\n\t\t\tExtra:         nil,\n\t\t})\n\t\treturn\n\t}\n\n\tp := detailsResp.GetProduct()\n\tresp := &product.Product{\n\t\tID:          productID,\n\t\tTitle:       p.GetTitle(),\n\t\tAuthor:      p.GetAuthor(),\n\t\tDescription: p.GetDescription(),\n\t\tRating:      reviewsResp.GetReview().GetRating(),\n\t}\n\n\tc.JSON(http.StatusOK, resp)\n}\n"
  },
  {
    "path": "bookinfo/internal/server/details/options.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage details\n\nimport (\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n)\n\n// Options server opts\ntype Options struct {\n\tServer *ServerOptions `mapstructure:\"server\"`\n}\n\n// DefaultOptions default opts\nfunc DefaultOptions() *Options {\n\treturn &Options{\n\t\tServer: DefaultServerOptions(),\n\t}\n}\n\n// Configure inject config\nfunc Configure(configProvider configparser.Provider) (*Options, error) {\n\topt := DefaultOptions()\n\n\tcp, err := configProvider.Get()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err = cp.UnmarshalExact(opt); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn opt, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/details/server.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage details\n\nimport (\n\t\"context\"\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details/detailsservice\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/constants\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/utils/logutils\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n)\n\n// Server kitex server\ntype Server struct {\n\topts *ServerOptions\n\tsvc  details.DetailsService\n}\n\n// ServerOptions server options\ntype ServerOptions struct {\n\tAddr     string         `mapstructure:\"addr\"`\n\tLogLevel logutils.Level `mapstructure:\"logLevel\"`\n}\n\n// DefaultServerOptions default opts\nfunc DefaultServerOptions() *ServerOptions {\n\treturn &ServerOptions{\n\t\tAddr:     \":8084\",\n\t\tLogLevel: logutils.LevelInfo,\n\t}\n}\n\n// Run kitex server\nfunc (s *Server) Run(ctx context.Context) error {\n\tklog.SetLogger(kitexlogrus.NewLogger())\n\tklog.SetLevel(s.opts.LogLevel.KitexLogLevel())\n\n\tp := provider.NewOpenTelemetryProvider(\n\t\tprovider.WithServiceName(constants.DetailsServiceName),\n\t\tprovider.WithInsecure(),\n\t)\n\tdefer func(p provider.OtelProvider, ctx context.Context) {\n\t\t_ = p.Shutdown(ctx)\n\t}(p, ctx)\n\n\taddr, err := net.ResolveTCPAddr(\"tcp\", s.opts.Addr)\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tsvr := detailsservice.NewServer(\n\t\ts.svc,\n\t\tserver.WithServiceAddr(addr),\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t)\n\tif err := svr.Run(); err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/details/wire.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n//go:build wireinject\n// +build wireinject\n\npackage details\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/service/details\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n\t\"github.com/google/wire\"\n)\n\n// NewServer build server with wire\nfunc NewServer(ctx context.Context) (*Server, error) {\n\tpanic(wire.Build(\n\t\tconfigparser.Default,\n\t\tConfigure,\n\n\t\tdetails.New,\n\n\t\twire.FieldsOf(new(*Options),\n\t\t\t\"Server\",\n\t\t),\n\t\twire.Struct(new(Server), \"*\"),\n\t))\n}\n"
  },
  {
    "path": "bookinfo/internal/server/details/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage details\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/service/details\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n)\n\n// Injectors from wire.go:\n\nfunc NewServer(ctx context.Context) (*Server, error) {\n\tprovider := configparser.Default()\n\toptions, err := Configure(provider)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tserverOptions := options.Server\n\tdetailsService := details.New()\n\tserver := &Server{\n\t\topts: serverOptions,\n\t\tsvc:  detailsService,\n\t}\n\treturn server, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/productpage/options.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage productpage\n\nimport (\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/injectors\"\n)\n\n// Options server opts\ntype Options struct {\n\tServer  *ServerOptions                  `mapstructure:\"server\"`\n\tReviews *injectors.ReviewClientOptions  `mapstructure:\"reviews\"`\n\tDetails *injectors.DetailsClientOptions `mapstructure:\"details\"`\n}\n\n// DefaultOptions default opts\nfunc DefaultOptions() *Options {\n\treturn &Options{\n\t\tServer:  DefaultServerOptions(),\n\t\tReviews: injectors.DefaultReviewClientOptions(),\n\t\tDetails: injectors.DefaultDetailsClientOptions(),\n\t}\n}\n\n// Configure inject config\nfunc Configure(configProvider configparser.Provider) (*Options, error) {\n\topt := DefaultOptions()\n\n\tcp, err := configProvider.Get()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err = cp.UnmarshalExact(opt); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn opt, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/productpage/server.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage productpage\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/handler/productpage\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/constants\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/utils/logutils\"\n\thertzserver \"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\thertztracing \"github.com/hertz-contrib/obs-opentelemetry/tracing\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n)\n\n// Server hertz server\ntype Server struct {\n\topts    *ServerOptions\n\thandler *productpage.Handler\n}\n\n// ServerOptions server opts\ntype ServerOptions struct {\n\tAddr     string         `mapstructure:\"addr\"`\n\tLogLevel logutils.Level `mapstructure:\"logLevel\"`\n}\n\n// DefaultServerOptions default opts\nfunc DefaultServerOptions() *ServerOptions {\n\treturn &ServerOptions{\n\t\tAddr:     \":8081\",\n\t\tLogLevel: logutils.LevelInfo,\n\t}\n}\n\n// Run hertz server\nfunc (s *Server) Run(ctx context.Context) error {\n\tklog.SetLogger(kitexlogrus.NewLogger())\n\tklog.SetLevel(s.opts.LogLevel.KitexLogLevel())\n\n\tp := provider.NewOpenTelemetryProvider(\n\t\tprovider.WithServiceName(constants.ProductpageServiceName),\n\t\tprovider.WithInsecure(),\n\t)\n\n\ttracer, cfg := hertztracing.NewServerTracer()\n\th := hertzserver.Default(\n\t\ttracer,\n\t\thertzserver.WithHostPorts(s.opts.Addr),\n\t)\n\th.Use(hertztracing.ServerMiddleware(cfg))\n\n\th.GET(\"/api/v1/products/:productID\", s.handler.GetProduct)\n\n\th.Spin()\n\n\treturn p.Shutdown(ctx)\n}\n"
  },
  {
    "path": "bookinfo/internal/server/productpage/wire.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n//go:build wireinject\n// +build wireinject\n\npackage productpage\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/handler/productpage\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/injectors\"\n\t\"github.com/google/wire\"\n)\n\n// NewServer build server with wire\nfunc NewServer(ctx context.Context) (*Server, error) {\n\tpanic(wire.Build(\n\t\tconfigparser.Default,\n\t\tConfigure,\n\n\t\tinjectors.ProvideReviewClient,\n\t\tinjectors.ProvideDetailsClient,\n\n\t\tproductpage.New,\n\n\t\twire.FieldsOf(new(*Options),\n\t\t\t\"Server\",\n\t\t\t\"Reviews\",\n\t\t\t\"Details\",\n\t\t),\n\t\twire.Struct(new(Server), \"*\"),\n\t))\n}\n"
  },
  {
    "path": "bookinfo/internal/server/productpage/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage productpage\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/handler/productpage\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/injectors\"\n)\n\n// Injectors from wire.go:\n\nfunc NewServer(ctx context.Context) (*Server, error) {\n\tprovider := configparser.Default()\n\toptions, err := Configure(provider)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tserverOptions := options.Server\n\treviewClientOptions := options.Reviews\n\tclient, err := injectors.ProvideReviewClient(reviewClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdetailsClientOptions := options.Details\n\tdetailsserviceClient, err := injectors.ProvideDetailsClient(detailsClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\thandler := productpage.New(client, detailsserviceClient)\n\tserver := &Server{\n\t\topts:    serverOptions,\n\t\thandler: handler,\n\t}\n\treturn server, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/ratings/options.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage ratings\n\nimport (\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n)\n\n// Options server opts\ntype Options struct {\n\tServer *ServerOptions `mapstructure:\"server\"`\n}\n\n// DefaultOptions default opts\nfunc DefaultOptions() *Options {\n\treturn &Options{\n\t\tServer: DefaultServerOptions(),\n\t}\n}\n\n// Configure inject config\nfunc Configure(configProvider configparser.Provider) (*Options, error) {\n\topt := DefaultOptions()\n\n\tcp, err := configProvider.Get()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err = cp.UnmarshalExact(opt); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn opt, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/ratings/server.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage ratings\n\nimport (\n\t\"context\"\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings/ratingservice\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/constants\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/utils/logutils\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n)\n\n// Server ratings server\ntype Server struct {\n\topts *ServerOptions\n\tsvc  ratings.RatingService\n}\n\n// ServerOptions server opts\ntype ServerOptions struct {\n\tAddr     string         `mapstructure:\"addr\"`\n\tLogLevel logutils.Level `mapstructure:\"logLevel\"`\n}\n\n// DefaultServerOptions default opts\nfunc DefaultServerOptions() *ServerOptions {\n\treturn &ServerOptions{\n\t\tAddr:     \":8083\",\n\t\tLogLevel: logutils.LevelInfo,\n\t}\n}\n\n// Run ratings server\nfunc (s *Server) Run(ctx context.Context) error {\n\tklog.SetLogger(kitexlogrus.NewLogger())\n\tklog.SetLevel(s.opts.LogLevel.KitexLogLevel())\n\n\tp := provider.NewOpenTelemetryProvider(\n\t\tprovider.WithServiceName(constants.RatingsServiceName),\n\t\tprovider.WithInsecure(),\n\t)\n\tdefer func(p provider.OtelProvider, ctx context.Context) {\n\t\t_ = p.Shutdown(ctx)\n\t}(p, ctx)\n\n\taddr, err := net.ResolveTCPAddr(\"tcp\", s.opts.Addr)\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tsvr := ratingservice.NewServer(\n\t\ts.svc,\n\t\tserver.WithServiceAddr(addr),\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t)\n\tif err := svr.Run(); err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/ratings/wire.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n//go:build wireinject\n// +build wireinject\n\npackage ratings\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/service/ratings\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n\t\"github.com/google/wire\"\n)\n\n// NewServer build server with wire\nfunc NewServer(ctx context.Context) (*Server, error) {\n\tpanic(wire.Build(\n\t\tconfigparser.Default,\n\t\tConfigure,\n\n\t\tratings.New,\n\n\t\twire.FieldsOf(new(*Options),\n\t\t\t\"Server\",\n\t\t),\n\t\twire.Struct(new(Server), \"*\"),\n\t))\n}\n"
  },
  {
    "path": "bookinfo/internal/server/ratings/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage ratings\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/service/ratings\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n)\n\n// Injectors from wire.go:\n\nfunc NewServer(ctx context.Context) (*Server, error) {\n\tprovider := configparser.Default()\n\toptions, err := Configure(provider)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tserverOptions := options.Server\n\tratingService := ratings.New()\n\tserver := &Server{\n\t\topts: serverOptions,\n\t\tsvc:  ratingService,\n\t}\n\treturn server, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/reviews/options.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage reviews\n\nimport (\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/injectors\"\n)\n\n// Options reviews opts\ntype Options struct {\n\tServer  *ServerOptions                  `mapstructure:\"server\"`\n\tRatings *injectors.RatingsClientOptions `mapstructure:\"ratings\"`\n}\n\n// DefaultOptions default opts\nfunc DefaultOptions() *Options {\n\treturn &Options{\n\t\tServer:  DefaultServerOptions(),\n\t\tRatings: injectors.DefaultRatingsClientOptions(),\n\t}\n}\n\n// Configure inject config\nfunc Configure(configProvider configparser.Provider) (*Options, error) {\n\topt := DefaultOptions()\n\n\tcp, err := configProvider.Get()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err = cp.UnmarshalExact(opt); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn opt, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/reviews/server.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage reviews\n\nimport (\n\t\"context\"\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings/ratingservice\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews/reviewsservice\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/constants\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/utils/logutils\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n)\n\n// Server reviews server\ntype Server struct {\n\topts          *ServerOptions\n\tsvc           reviews.ReviewsService\n\tratingsClient ratingservice.Client\n}\n\n// ServerOptions server opts\ntype ServerOptions struct {\n\tAddr     string         `mapstructure:\"addr\"`\n\tLogLevel logutils.Level `mapstructure:\"logLevel\"`\n}\n\n// DefaultServerOptions default opts\nfunc DefaultServerOptions() *ServerOptions {\n\treturn &ServerOptions{\n\t\tAddr:     \":8082\",\n\t\tLogLevel: logutils.LevelInfo,\n\t}\n}\n\n// Run reviews server\nfunc (s *Server) Run(ctx context.Context) error {\n\tklog.SetLogger(kitexlogrus.NewLogger())\n\tklog.SetLevel(s.opts.LogLevel.KitexLogLevel())\n\n\tp := provider.NewOpenTelemetryProvider(\n\t\tprovider.WithServiceName(constants.ReviewsServiceName),\n\t\tprovider.WithInsecure(),\n\t)\n\tdefer func(p provider.OtelProvider, ctx context.Context) {\n\t\t_ = p.Shutdown(ctx)\n\t}(p, ctx)\n\n\taddr, err := net.ResolveTCPAddr(\"tcp\", s.opts.Addr)\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tsvr := reviewsservice.NewServer(\n\t\ts.svc,\n\t\tserver.WithServiceAddr(addr),\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t)\n\tif err := svr.Run(); err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "bookinfo/internal/server/reviews/wire.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n//go:build wireinject\n// +build wireinject\n\npackage reviews\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/service/reviews\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/injectors\"\n\t\"github.com/google/wire\"\n)\n\n// NewServer build server with wire\nfunc NewServer(ctx context.Context) (*Server, error) {\n\tpanic(wire.Build(\n\t\tconfigparser.Default,\n\t\tConfigure,\n\n\t\tinjectors.ProvideRatingsClient,\n\n\t\treviews.New,\n\n\t\twire.FieldsOf(new(*Options),\n\t\t\t\"Server\",\n\t\t\t\"Ratings\",\n\t\t),\n\t\twire.Struct(new(Server), \"*\"),\n\t))\n}\n"
  },
  {
    "path": "bookinfo/internal/server/reviews/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage reviews\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/internal/service/reviews\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/configparser\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/injectors\"\n)\n\n// Injectors from wire.go:\n\nfunc NewServer(ctx context.Context) (*Server, error) {\n\tprovider := configparser.Default()\n\toptions, err := Configure(provider)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tserverOptions := options.Server\n\tratingsClientOptions := options.Ratings\n\tclient, err := injectors.ProvideRatingsClient(ratingsClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treviewsService := reviews.New(client)\n\tserver := &Server{\n\t\topts:          serverOptions,\n\t\tsvc:           reviewsService,\n\t\tratingsClient: client,\n\t}\n\treturn server, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/service/details/service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage details\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"go.opentelemetry.io/otel/baggage\"\n)\n\ntype impl struct{}\n\n// New create service impl instance\nfunc New() details.DetailsService {\n\treturn &impl{}\n}\n\n// GetProduct get product detail info\nfunc (i *impl) GetProduct(ctx context.Context, req *details.GetProductReq) (r *details.GetProductResp, err error) {\n\tklog.CtxInfof(ctx, \"get product details %s\", req.ID)\n\tklog.CtxDebugf(ctx, \"baggage: %s\", baggage.FromContext(ctx).String())\n\n\treturn &details.GetProductResp{\n\t\tProduct: &details.Product{\n\t\t\tID:          req.GetID(),\n\t\t\tTitle:       \"《Also sprach Zarathustra》\",\n\t\t\tAuthor:      \"Friedrich Nietzsche\",\n\t\t\tDescription: `Thus Spoke Zarathustra: A Book for All and None, also translated as Thus Spake Zarathustra, is a work of philosophical fiction written by German philosopher Friedrich Nietzsche between 1883 and 1885.`,\n\t\t},\n\t}, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/service/ratings/service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage ratings\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/constants\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"go.opentelemetry.io/otel/baggage\"\n)\n\ntype impl struct{}\n\n// New create service impl\nfunc New() ratings.RatingService {\n\treturn &impl{}\n}\n\n// Ratings get ratings\nfunc (i *impl) Ratings(ctx context.Context, req *ratings.RatingReq) (r *ratings.RatingResp, err error) {\n\tklog.CtxInfof(ctx, \"get product details %s\", req.ProductID)\n\tklog.CtxDebugf(ctx, \"baggage: %s\", baggage.FromContext(ctx).String())\n\n\tratingValue, err := strconv.ParseInt(os.Getenv(constants.RatingsValueEnvKey), 10, 8)\n\tif err != nil {\n\t\tratingValue = 1\n\t}\n\treturn &ratings.RatingResp{\n\t\tRating: int8(ratingValue),\n\t}, nil\n}\n"
  },
  {
    "path": "bookinfo/internal/service/reviews/service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage reviews\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings/ratingservice\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/constants\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"go.opentelemetry.io/otel/baggage\"\n)\n\ntype impl struct {\n\tratingsClient ratingservice.Client\n}\n\n// New create service impl\nfunc New(ratingsClient ratingservice.Client) reviews.ReviewsService {\n\treturn &impl{ratingsClient: ratingsClient}\n}\n\n// ReviewProduct review product\nfunc (i *impl) ReviewProduct(ctx context.Context, req *reviews.ReviewReq) (r *reviews.ReviewResp, err error) {\n\tklog.CtxDebugf(ctx, \"baggage: %s\", baggage.FromContext(ctx).String())\n\n\tif os.Getenv(constants.EnableRatingsEnvKey) == constants.Disable {\n\t\treturn &reviews.ReviewResp{\n\t\t\tReview: &reviews.Review{\n\t\t\t\tType:   reviews.ReviewType_Local,\n\t\t\t\tRating: 0,\n\t\t\t},\n\t\t}, err\n\t}\n\n\tratingResp, err := i.ratingsClient.Ratings(ctx, &ratings.RatingReq{ProductID: req.GetProductID()})\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"call ratings error: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn &reviews.ReviewResp{\n\t\tReview: &reviews.Review{\n\t\t\tType:   reviews.ReviewType_Green,\n\t\t\tRating: ratingResp.GetRating(),\n\t\t},\n\t}, nil\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/base/base.go",
    "content": "// Code generated by thriftgo (0.2.1). DO NOT EDIT.\n\npackage base\n\nimport (\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype BaseResp struct {\n\tStatusMessage string            `thrift:\"StatusMessage,1\" json:\"StatusMessage\"`\n\tStatusCode    int32             `thrift:\"StatusCode,2\" json:\"StatusCode\"`\n\tExtra         map[string]string `thrift:\"Extra,3,optional\" json:\"Extra,omitempty\"`\n}\n\nfunc NewBaseResp() *BaseResp {\n\treturn &BaseResp{\n\n\t\tStatusMessage: \"\",\n\t\tStatusCode:    0,\n\t}\n}\n\nfunc (p *BaseResp) GetStatusMessage() (v string) {\n\treturn p.StatusMessage\n}\n\nfunc (p *BaseResp) GetStatusCode() (v int32) {\n\treturn p.StatusCode\n}\n\nvar BaseResp_Extra_DEFAULT map[string]string\n\nfunc (p *BaseResp) GetExtra() (v map[string]string) {\n\tif !p.IsSetExtra() {\n\t\treturn BaseResp_Extra_DEFAULT\n\t}\n\treturn p.Extra\n}\nfunc (p *BaseResp) SetStatusMessage(val string) {\n\tp.StatusMessage = val\n}\nfunc (p *BaseResp) SetStatusCode(val int32) {\n\tp.StatusCode = val\n}\nfunc (p *BaseResp) SetExtra(val map[string]string) {\n\tp.Extra = val\n}\n\nvar fieldIDToName_BaseResp = map[int16]string{\n\t1: \"StatusMessage\",\n\t2: \"StatusCode\",\n\t3: \"Extra\",\n}\n\nfunc (p *BaseResp) IsSetExtra() bool {\n\treturn p.Extra != nil\n}\n\nfunc (p *BaseResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.MAP {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BaseResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusMessage = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusCode = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField3(iprot thrift.TProtocol) error {\n\t_, _, size, err := iprot.ReadMapBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Extra = make(map[string]string, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _key string\n\t\tif v, err := iprot.ReadString(); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t_key = v\n\t\t}\n\n\t\tvar _val string\n\t\tif v, err := iprot.ReadString(); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t_val = v\n\t\t}\n\n\t\tp.Extra[_key] = _val\n\t}\n\tif err := iprot.ReadMapEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"BaseResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"StatusMessage\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.StatusMessage); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"StatusCode\", thrift.I32, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI32(p.StatusCode); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetExtra() {\n\t\tif err = oprot.WriteFieldBegin(\"Extra\", thrift.MAP, 3); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(p.Extra)); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor k, v := range p.Extra {\n\n\t\t\tif err := oprot.WriteString(k); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif err := oprot.WriteString(v); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := oprot.WriteMapEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *BaseResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BaseResp(%+v)\", *p)\n}\n\nfunc (p *BaseResp) DeepEqual(ano *BaseResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.StatusMessage) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.StatusCode) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Extra) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *BaseResp) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.StatusMessage, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BaseResp) Field2DeepEqual(src int32) bool {\n\n\tif p.StatusCode != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BaseResp) Field3DeepEqual(src map[string]string) bool {\n\n\tif len(p.Extra) != len(src) {\n\t\treturn false\n\t}\n\tfor k, v := range p.Extra {\n\t\t_src := src[k]\n\t\tif strings.Compare(v, _src) != 0 {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/base/k-base.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage base\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *BaseResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.MAP {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BaseResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StatusMessage = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BaseResp) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI32(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StatusCode = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BaseResp) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, _, size, l, err := bthrift.Binary.ReadMapBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Extra = make(map[string]string, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _key string\n\t\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\n\t\t\t_key = v\n\n\t\t}\n\n\t\tvar _val string\n\t\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\n\t\t\t_val = v\n\n\t\t}\n\n\t\tp.Extra[_key] = _val\n\t}\n\tif l, err := bthrift.Binary.ReadMapEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *BaseResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *BaseResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"BaseResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"BaseResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"StatusMessage\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.StatusMessage)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"StatusCode\", thrift.I32, 2)\n\toffset += bthrift.Binary.WriteI32(buf[offset:], p.StatusCode)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetExtra() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Extra\", thrift.MAP, 3)\n\t\tmapBeginOffset := offset\n\t\toffset += bthrift.Binary.MapBeginLength(thrift.STRING, thrift.STRING, 0)\n\t\tvar length int\n\t\tfor k, v := range p.Extra {\n\t\t\tlength++\n\n\t\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, k)\n\n\t\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, v)\n\n\t\t}\n\t\tbthrift.Binary.WriteMapBegin(buf[mapBeginOffset:], thrift.STRING, thrift.STRING, length)\n\t\toffset += bthrift.Binary.WriteMapEnd(buf[offset:])\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *BaseResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"StatusMessage\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.StatusMessage)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"StatusCode\", thrift.I32, 2)\n\tl += bthrift.Binary.I32Length(p.StatusCode)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) field3Length() int {\n\tl := 0\n\tif p.IsSetExtra() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"Extra\", thrift.MAP, 3)\n\t\tl += bthrift.Binary.MapBeginLength(thrift.STRING, thrift.STRING, len(p.Extra))\n\t\tfor k, v := range p.Extra {\n\n\t\t\tl += bthrift.Binary.StringLengthNocopy(k)\n\n\t\t\tl += bthrift.Binary.StringLengthNocopy(v)\n\n\t\t}\n\t\tl += bthrift.Binary.MapEndLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/base/k-consts.go",
    "content": "package base\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/details/details.go",
    "content": "// Code generated by thriftgo (0.2.1). DO NOT EDIT.\n\npackage details\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Product struct {\n\tID          string `thrift:\"ID,1,required\" json:\"ID\"`\n\tTitle       string `thrift:\"Title,2,required\" json:\"Title\"`\n\tAuthor      string `thrift:\"Author,3,required\" json:\"Author\"`\n\tDescription string `thrift:\"Description,4,required\" json:\"Description\"`\n}\n\nfunc NewProduct() *Product {\n\treturn &Product{}\n}\n\nfunc (p *Product) GetID() (v string) {\n\treturn p.ID\n}\n\nfunc (p *Product) GetTitle() (v string) {\n\treturn p.Title\n}\n\nfunc (p *Product) GetAuthor() (v string) {\n\treturn p.Author\n}\n\nfunc (p *Product) GetDescription() (v string) {\n\treturn p.Description\n}\nfunc (p *Product) SetID(val string) {\n\tp.ID = val\n}\nfunc (p *Product) SetTitle(val string) {\n\tp.Title = val\n}\nfunc (p *Product) SetAuthor(val string) {\n\tp.Author = val\n}\nfunc (p *Product) SetDescription(val string) {\n\tp.Description = val\n}\n\nvar fieldIDToName_Product = map[int16]string{\n\t1: \"ID\",\n\t2: \"Title\",\n\t3: \"Author\",\n\t4: \"Description\",\n}\n\nfunc (p *Product) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetID bool = false\n\tvar issetTitle bool = false\n\tvar issetAuthor bool = false\n\tvar issetDescription bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetID = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetTitle = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetAuthor = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetDescription = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetTitle {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetAuthor {\n\t\tfieldId = 3\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetDescription {\n\t\tfieldId = 4\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Product[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_Product[fieldId]))\n}\n\nfunc (p *Product) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ID = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Title = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Author = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Description = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Product\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Product) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"ID\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.ID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Product) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Title\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Title); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *Product) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Author\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Author); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *Product) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Description\", thrift.STRING, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Description); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *Product) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Product(%+v)\", *p)\n}\n\nfunc (p *Product) DeepEqual(ano *Product) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ID) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Title) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Author) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.Description) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Product) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.ID, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Title, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Author, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field4DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Description, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype GetProductReq struct {\n\tID string `thrift:\"ID,1,required\" json:\"ID\"`\n}\n\nfunc NewGetProductReq() *GetProductReq {\n\treturn &GetProductReq{}\n}\n\nfunc (p *GetProductReq) GetID() (v string) {\n\treturn p.ID\n}\nfunc (p *GetProductReq) SetID(val string) {\n\tp.ID = val\n}\n\nvar fieldIDToName_GetProductReq = map[int16]string{\n\t1: \"ID\",\n}\n\nfunc (p *GetProductReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetID bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetID = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetProductReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetProductReq[fieldId]))\n}\n\nfunc (p *GetProductReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ID = v\n\t}\n\treturn nil\n}\n\nfunc (p *GetProductReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetProductReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *GetProductReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"ID\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.ID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *GetProductReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"GetProductReq(%+v)\", *p)\n}\n\nfunc (p *GetProductReq) DeepEqual(ano *GetProductReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ID) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *GetProductReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.ID, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype GetProductResp struct {\n\tProduct *Product `thrift:\"Product,1,required\" json:\"Product\"`\n}\n\nfunc NewGetProductResp() *GetProductResp {\n\treturn &GetProductResp{}\n}\n\nvar GetProductResp_Product_DEFAULT *Product\n\nfunc (p *GetProductResp) GetProduct() (v *Product) {\n\tif !p.IsSetProduct() {\n\t\treturn GetProductResp_Product_DEFAULT\n\t}\n\treturn p.Product\n}\nfunc (p *GetProductResp) SetProduct(val *Product) {\n\tp.Product = val\n}\n\nvar fieldIDToName_GetProductResp = map[int16]string{\n\t1: \"Product\",\n}\n\nfunc (p *GetProductResp) IsSetProduct() bool {\n\treturn p.Product != nil\n}\n\nfunc (p *GetProductResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProduct bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProduct = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProduct {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetProductResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetProductResp[fieldId]))\n}\n\nfunc (p *GetProductResp) ReadField1(iprot thrift.TProtocol) error {\n\tp.Product = NewProduct()\n\tif err := p.Product.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *GetProductResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetProductResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *GetProductResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Product\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Product.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *GetProductResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"GetProductResp(%+v)\", *p)\n}\n\nfunc (p *GetProductResp) DeepEqual(ano *GetProductResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Product) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *GetProductResp) Field1DeepEqual(src *Product) bool {\n\n\tif !p.Product.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype DetailsService interface {\n\tGetProduct(ctx context.Context, req *GetProductReq) (r *GetProductResp, err error)\n}\n\ntype DetailsServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewDetailsServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *DetailsServiceClient {\n\treturn &DetailsServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewDetailsServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *DetailsServiceClient {\n\treturn &DetailsServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewDetailsServiceClient(c thrift.TClient) *DetailsServiceClient {\n\treturn &DetailsServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *DetailsServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *DetailsServiceClient) GetProduct(ctx context.Context, req *GetProductReq) (r *GetProductResp, err error) {\n\tvar _args DetailsServiceGetProductArgs\n\t_args.Req = req\n\tvar _result DetailsServiceGetProductResult\n\tif err = p.Client_().Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype DetailsServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      DetailsService\n}\n\nfunc (p *DetailsServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *DetailsServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *DetailsServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewDetailsServiceProcessor(handler DetailsService) *DetailsServiceProcessor {\n\tself := &DetailsServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"GetProduct\", &detailsServiceProcessorGetProduct{handler: handler})\n\treturn self\n}\nfunc (p *DetailsServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype detailsServiceProcessorGetProduct struct {\n\thandler DetailsService\n}\n\nfunc (p *detailsServiceProcessorGetProduct) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := DetailsServiceGetProductArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"GetProduct\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := DetailsServiceGetProductResult{}\n\tvar retval *GetProductResp\n\tif retval, err2 = p.handler.GetProduct(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing GetProduct: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"GetProduct\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"GetProduct\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype DetailsServiceGetProductArgs struct {\n\tReq *GetProductReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewDetailsServiceGetProductArgs() *DetailsServiceGetProductArgs {\n\treturn &DetailsServiceGetProductArgs{}\n}\n\nvar DetailsServiceGetProductArgs_Req_DEFAULT *GetProductReq\n\nfunc (p *DetailsServiceGetProductArgs) GetReq() (v *GetProductReq) {\n\tif !p.IsSetReq() {\n\t\treturn DetailsServiceGetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *DetailsServiceGetProductArgs) SetReq(val *GetProductReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_DetailsServiceGetProductArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *DetailsServiceGetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *DetailsServiceGetProductArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DetailsServiceGetProductArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DetailsServiceGetProductArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewGetProductReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *DetailsServiceGetProductArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetProduct_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DetailsServiceGetProductArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *DetailsServiceGetProductArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DetailsServiceGetProductArgs(%+v)\", *p)\n}\n\nfunc (p *DetailsServiceGetProductArgs) DeepEqual(ano *DetailsServiceGetProductArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *DetailsServiceGetProductArgs) Field1DeepEqual(src *GetProductReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype DetailsServiceGetProductResult struct {\n\tSuccess *GetProductResp `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewDetailsServiceGetProductResult() *DetailsServiceGetProductResult {\n\treturn &DetailsServiceGetProductResult{}\n}\n\nvar DetailsServiceGetProductResult_Success_DEFAULT *GetProductResp\n\nfunc (p *DetailsServiceGetProductResult) GetSuccess() (v *GetProductResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn DetailsServiceGetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *DetailsServiceGetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*GetProductResp)\n}\n\nvar fieldIDToName_DetailsServiceGetProductResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *DetailsServiceGetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *DetailsServiceGetProductResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DetailsServiceGetProductResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DetailsServiceGetProductResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewGetProductResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *DetailsServiceGetProductResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetProduct_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DetailsServiceGetProductResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *DetailsServiceGetProductResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DetailsServiceGetProductResult(%+v)\", *p)\n}\n\nfunc (p *DetailsServiceGetProductResult) DeepEqual(ano *DetailsServiceGetProductResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *DetailsServiceGetProductResult) Field0DeepEqual(src *GetProductResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/details/detailsservice/client.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage detailsservice\n\nimport (\n\t\"context\"\n\tdetails \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tGetProduct(ctx context.Context, req *details.GetProductReq, callOptions ...callopt.Option) (r *details.GetProductResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kDetailsServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kDetailsServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kDetailsServiceClient) GetProduct(ctx context.Context, req *details.GetProductReq, callOptions ...callopt.Option) (r *details.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, req)\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/details/detailsservice/detailsservice.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage detailsservice\n\nimport (\n\t\"context\"\n\tdetails \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn detailsServiceServiceInfo\n}\n\nvar detailsServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"DetailsService\"\n\thandlerType := (*details.DetailsService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"GetProduct\": kitex.NewMethodInfo(getProductHandler, newDetailsServiceGetProductArgs, newDetailsServiceGetProductResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"details\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.2\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*details.DetailsServiceGetProductArgs)\n\trealResult := result.(*details.DetailsServiceGetProductResult)\n\tsuccess, err := handler.(details.DetailsService).GetProduct(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newDetailsServiceGetProductArgs() interface{} {\n\treturn details.NewDetailsServiceGetProductArgs()\n}\n\nfunc newDetailsServiceGetProductResult() interface{} {\n\treturn details.NewDetailsServiceGetProductResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, req *details.GetProductReq) (r *details.GetProductResp, err error) {\n\tvar _args details.DetailsServiceGetProductArgs\n\t_args.Req = req\n\tvar _result details.DetailsServiceGetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/details/detailsservice/invoker.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage detailsservice\n\nimport (\n\tdetails \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler details.DetailsService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/details/detailsservice/server.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\npackage detailsservice\n\nimport (\n\tdetails \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler details.DetailsService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/details/k-consts.go",
    "content": "package details\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/details/k-details.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage details\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/base\"\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n\t_ = base.KitexUnusedProtection\n)\n\nfunc (p *Product) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetID bool = false\n\tvar issetTitle bool = false\n\tvar issetAuthor bool = false\n\tvar issetDescription bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetID = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetTitle = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetAuthor = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetDescription = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetTitle {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetAuthor {\n\t\tfieldId = 3\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetDescription {\n\t\tfieldId = 4\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Product[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_Product[fieldId]))\n}\n\nfunc (p *Product) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ID = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Title = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Author = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Description = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Product) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Product) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Product\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Product\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Product) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"ID\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.ID)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Title\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Title)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Author\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Author)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Description\", thrift.STRING, 4)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Description)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"ID\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.ID)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Title\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Title)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Author\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.Author)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Description\", thrift.STRING, 4)\n\tl += bthrift.Binary.StringLengthNocopy(p.Description)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetProductReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetID bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetID = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetProductReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetProductReq[fieldId]))\n}\n\nfunc (p *GetProductReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ID = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *GetProductReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *GetProductReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetProductReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetProductReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetProductReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *GetProductReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"ID\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.ID)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetProductReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"ID\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.ID)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetProductResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProduct bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProduct = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProduct {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetProductResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetProductResp[fieldId]))\n}\n\nfunc (p *GetProductResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewProduct()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Product = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *GetProductResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *GetProductResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetProductResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetProductResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetProductResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *GetProductResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Product\", thrift.STRUCT, 1)\n\toffset += p.Product.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetProductResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Product\", thrift.STRUCT, 1)\n\tl += p.Product.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DetailsServiceGetProductArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DetailsServiceGetProductArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DetailsServiceGetProductArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewGetProductReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *DetailsServiceGetProductArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *DetailsServiceGetProductArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetProduct_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DetailsServiceGetProductArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetProduct_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *DetailsServiceGetProductArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DetailsServiceGetProductArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DetailsServiceGetProductResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DetailsServiceGetProductResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DetailsServiceGetProductResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewGetProductResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *DetailsServiceGetProductResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *DetailsServiceGetProductResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetProduct_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DetailsServiceGetProductResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetProduct_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *DetailsServiceGetProductResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *DetailsServiceGetProductResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *DetailsServiceGetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *DetailsServiceGetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/product/k-consts.go",
    "content": "package product\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/product/k-productpage.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/base\"\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n\t_ = base.KitexUnusedProtection\n)\n\nfunc (p *Product) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetID bool = false\n\tvar issetTitle bool = false\n\tvar issetAuthor bool = false\n\tvar issetDescription bool = false\n\tvar issetRating bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetID = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetTitle = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetAuthor = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetDescription = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetRating = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetTitle {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetAuthor {\n\t\tfieldId = 3\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetDescription {\n\t\tfieldId = 4\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetRating {\n\t\tfieldId = 5\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Product[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_Product[fieldId]))\n}\n\nfunc (p *Product) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ID = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Title = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Author = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Description = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Product) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadByte(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Rating = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Product) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Product) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Product\")\n\tif p != nil {\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Product\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Product) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"ID\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.ID)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Title\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Title)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Author\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Author)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Description\", thrift.STRING, 4)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Description)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Rating\", thrift.BYTE, 5)\n\toffset += bthrift.Binary.WriteByte(buf[offset:], p.Rating)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Product) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"ID\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.ID)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Title\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Title)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Author\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.Author)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Description\", thrift.STRING, 4)\n\tl += bthrift.Binary.StringLengthNocopy(p.Description)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Product) field5Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Rating\", thrift.BYTE, 5)\n\tl += bthrift.Binary.ByteLength(p.Rating)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetProductReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetID bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetID = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetProductReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetProductReq[fieldId]))\n}\n\nfunc (p *GetProductReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ID = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *GetProductReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *GetProductReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetProductReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetProductReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetProductReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *GetProductReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"ID\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.ID)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetProductReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"ID\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.ID)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *GetProductResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProduct bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProduct = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProduct {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetProductResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetProductResp[fieldId]))\n}\n\nfunc (p *GetProductResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewProduct()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Product = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *GetProductResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *GetProductResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetProductResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetProductResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetProductResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *GetProductResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Product\", thrift.STRUCT, 1)\n\toffset += p.Product.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *GetProductResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Product\", thrift.STRUCT, 1)\n\tl += p.Product.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ListProductsReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto SkipFieldTypeError\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\n\nSkipFieldTypeError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T skip field type %d error\", p, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\n// for compatibility\nfunc (p *ListProductsReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ListProductsReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListProductsReq\")\n\tif p != nil {\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListProductsReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListProductsReq\")\n\tif p != nil {\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ListProductsResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetItems bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetItems = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField255(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetItems {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListProductsResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_ListProductsResp[fieldId]))\n}\n\nfunc (p *ListProductsResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Items = make([]*Product, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewProduct()\n\t\tif l, err := _elem.FastRead(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\t\t}\n\n\t\tp.Items = append(p.Items, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\nfunc (p *ListProductsResp) FastReadField255(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := base.NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ListProductsResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ListProductsResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListProductsResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField255(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListProductsResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListProductsResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field255Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ListProductsResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Items\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.STRUCT, 0)\n\tvar length int\n\tfor _, v := range p.Items {\n\t\tlength++\n\t\toffset += v.FastWriteNocopy(buf[offset:], binaryWriter)\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.STRUCT, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListProductsResp) fastWriteField255(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"BaseResp\", thrift.STRUCT, 255)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ListProductsResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Items\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.STRUCT, len(p.Items))\n\tfor _, v := range p.Items {\n\t\tl += v.BLength()\n\t}\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ListProductsResp) field255Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"BaseResp\", thrift.STRUCT, 255)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ProductPageServiceGetProductArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ProductPageServiceGetProductArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceGetProductArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewGetProductReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ProductPageServiceGetProductArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ProductPageServiceGetProductArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetProduct_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ProductPageServiceGetProductArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetProduct_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ProductPageServiceGetProductArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ProductPageServiceGetProductArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ProductPageServiceGetProductResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ProductPageServiceGetProductResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceGetProductResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewGetProductResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ProductPageServiceGetProductResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ProductPageServiceGetProductResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"GetProduct_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ProductPageServiceGetProductResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"GetProduct_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ProductPageServiceGetProductResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ProductPageServiceGetProductResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ProductPageServiceListProductsArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ProductPageServiceListProductsArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceListProductsArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewListProductsReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ProductPageServiceListProductsArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ProductPageServiceListProductsArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListProducts_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ProductPageServiceListProductsArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListProducts_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ProductPageServiceListProductsArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ProductPageServiceListProductsArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ProductPageServiceListProductsResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ProductPageServiceListProductsResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceListProductsResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewListProductsResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ProductPageServiceListProductsResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ProductPageServiceListProductsResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ListProducts_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ProductPageServiceListProductsResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ListProducts_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ProductPageServiceListProductsResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ProductPageServiceListProductsResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ProductPageServiceGetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ProductPageServiceGetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *ProductPageServiceListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ProductPageServiceListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/product/productpage.go",
    "content": "// Code generated by thriftgo (0.2.1). DO NOT EDIT.\n\npackage product\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/base\"\n\t\"strings\"\n)\n\ntype Product struct {\n\tID          string `thrift:\"ID,1,required\" json:\"ID\"`\n\tTitle       string `thrift:\"Title,2,required\" json:\"Title\"`\n\tAuthor      string `thrift:\"Author,3,required\" json:\"Author\"`\n\tDescription string `thrift:\"Description,4,required\" json:\"Description\"`\n\tRating      int8   `thrift:\"Rating,5,required\" json:\"Rating\"`\n}\n\nfunc NewProduct() *Product {\n\treturn &Product{}\n}\n\nfunc (p *Product) GetID() (v string) {\n\treturn p.ID\n}\n\nfunc (p *Product) GetTitle() (v string) {\n\treturn p.Title\n}\n\nfunc (p *Product) GetAuthor() (v string) {\n\treturn p.Author\n}\n\nfunc (p *Product) GetDescription() (v string) {\n\treturn p.Description\n}\n\nfunc (p *Product) GetRating() (v int8) {\n\treturn p.Rating\n}\nfunc (p *Product) SetID(val string) {\n\tp.ID = val\n}\nfunc (p *Product) SetTitle(val string) {\n\tp.Title = val\n}\nfunc (p *Product) SetAuthor(val string) {\n\tp.Author = val\n}\nfunc (p *Product) SetDescription(val string) {\n\tp.Description = val\n}\nfunc (p *Product) SetRating(val int8) {\n\tp.Rating = val\n}\n\nvar fieldIDToName_Product = map[int16]string{\n\t1: \"ID\",\n\t2: \"Title\",\n\t3: \"Author\",\n\t4: \"Description\",\n\t5: \"Rating\",\n}\n\nfunc (p *Product) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetID bool = false\n\tvar issetTitle bool = false\n\tvar issetAuthor bool = false\n\tvar issetDescription bool = false\n\tvar issetRating bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetID = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetTitle = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetAuthor = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetDescription = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetRating = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetTitle {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetAuthor {\n\t\tfieldId = 3\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetDescription {\n\t\tfieldId = 4\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetRating {\n\t\tfieldId = 5\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Product[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_Product[fieldId]))\n}\n\nfunc (p *Product) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ID = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Title = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Author = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Description = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) ReadField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadByte(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Rating = v\n\t}\n\treturn nil\n}\n\nfunc (p *Product) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Product\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Product) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"ID\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.ID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Product) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Title\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Title); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *Product) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Author\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Author); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *Product) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Description\", thrift.STRING, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Description); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *Product) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Rating\", thrift.BYTE, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteByte(p.Rating); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *Product) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Product(%+v)\", *p)\n}\n\nfunc (p *Product) DeepEqual(ano *Product) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ID) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Title) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Author) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.Description) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.Rating) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Product) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.ID, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Title, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Author, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field4DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Description, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Product) Field5DeepEqual(src int8) bool {\n\n\tif p.Rating != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype GetProductReq struct {\n\tID string `thrift:\"ID,1,required\" json:\"ID\"`\n}\n\nfunc NewGetProductReq() *GetProductReq {\n\treturn &GetProductReq{}\n}\n\nfunc (p *GetProductReq) GetID() (v string) {\n\treturn p.ID\n}\nfunc (p *GetProductReq) SetID(val string) {\n\tp.ID = val\n}\n\nvar fieldIDToName_GetProductReq = map[int16]string{\n\t1: \"ID\",\n}\n\nfunc (p *GetProductReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetID bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetID = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetProductReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetProductReq[fieldId]))\n}\n\nfunc (p *GetProductReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ID = v\n\t}\n\treturn nil\n}\n\nfunc (p *GetProductReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetProductReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *GetProductReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"ID\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.ID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *GetProductReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"GetProductReq(%+v)\", *p)\n}\n\nfunc (p *GetProductReq) DeepEqual(ano *GetProductReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ID) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *GetProductReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.ID, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype GetProductResp struct {\n\tProduct *Product `thrift:\"Product,1,required\" json:\"Product\"`\n}\n\nfunc NewGetProductResp() *GetProductResp {\n\treturn &GetProductResp{}\n}\n\nvar GetProductResp_Product_DEFAULT *Product\n\nfunc (p *GetProductResp) GetProduct() (v *Product) {\n\tif !p.IsSetProduct() {\n\t\treturn GetProductResp_Product_DEFAULT\n\t}\n\treturn p.Product\n}\nfunc (p *GetProductResp) SetProduct(val *Product) {\n\tp.Product = val\n}\n\nvar fieldIDToName_GetProductResp = map[int16]string{\n\t1: \"Product\",\n}\n\nfunc (p *GetProductResp) IsSetProduct() bool {\n\treturn p.Product != nil\n}\n\nfunc (p *GetProductResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProduct bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProduct = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProduct {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_GetProductResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_GetProductResp[fieldId]))\n}\n\nfunc (p *GetProductResp) ReadField1(iprot thrift.TProtocol) error {\n\tp.Product = NewProduct()\n\tif err := p.Product.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *GetProductResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetProductResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *GetProductResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Product\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Product.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *GetProductResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"GetProductResp(%+v)\", *p)\n}\n\nfunc (p *GetProductResp) DeepEqual(ano *GetProductResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Product) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *GetProductResp) Field1DeepEqual(src *Product) bool {\n\n\tif !p.Product.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ListProductsReq struct {\n}\n\nfunc NewListProductsReq() *ListProductsReq {\n\treturn &ListProductsReq{}\n}\n\nvar fieldIDToName_ListProductsReq = map[int16]string{}\n\nfunc (p *ListProductsReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\tgoto SkipFieldTypeError\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nSkipFieldTypeError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T skip field type %d error\", p, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ListProductsReq) Write(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteStructBegin(\"ListProductsReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ListProductsReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ListProductsReq(%+v)\", *p)\n}\n\nfunc (p *ListProductsReq) DeepEqual(ano *ListProductsReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ListProductsResp struct {\n\tItems    []*Product     `thrift:\"Items,1,required\" json:\"Items\"`\n\tBaseResp *base.BaseResp `thrift:\"BaseResp,255\" json:\"BaseResp\"`\n}\n\nfunc NewListProductsResp() *ListProductsResp {\n\treturn &ListProductsResp{}\n}\n\nfunc (p *ListProductsResp) GetItems() (v []*Product) {\n\treturn p.Items\n}\n\nvar ListProductsResp_BaseResp_DEFAULT *base.BaseResp\n\nfunc (p *ListProductsResp) GetBaseResp() (v *base.BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn ListProductsResp_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *ListProductsResp) SetItems(val []*Product) {\n\tp.Items = val\n}\nfunc (p *ListProductsResp) SetBaseResp(val *base.BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_ListProductsResp = map[int16]string{\n\t1:   \"Items\",\n\t255: \"BaseResp\",\n}\n\nfunc (p *ListProductsResp) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *ListProductsResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetItems bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetItems = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 255:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField255(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetItems {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ListProductsResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_ListProductsResp[fieldId]))\n}\n\nfunc (p *ListProductsResp) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Items = make([]*Product, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewProduct()\n\t\tif err := _elem.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.Items = append(p.Items, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ListProductsResp) ReadField255(iprot thrift.TProtocol) error {\n\tp.BaseResp = base.NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ListProductsResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ListProductsResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField255(oprot); err != nil {\n\t\t\tfieldId = 255\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ListProductsResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Items\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Items)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Items {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ListProductsResp) writeField255(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"BaseResp\", thrift.STRUCT, 255); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 255 end error: \", p), err)\n}\n\nfunc (p *ListProductsResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ListProductsResp(%+v)\", *p)\n}\n\nfunc (p *ListProductsResp) DeepEqual(ano *ListProductsResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Items) {\n\t\treturn false\n\t}\n\tif !p.Field255DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ListProductsResp) Field1DeepEqual(src []*Product) bool {\n\n\tif len(p.Items) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.Items {\n\t\t_src := src[i]\n\t\tif !v.DeepEqual(_src) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc (p *ListProductsResp) Field255DeepEqual(src *base.BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ProductPageService interface {\n\tGetProduct(ctx context.Context, req *GetProductReq) (r *GetProductResp, err error)\n\n\tListProducts(ctx context.Context, req *ListProductsReq) (r *ListProductsResp, err error)\n}\n\ntype ProductPageServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewProductPageServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *ProductPageServiceClient {\n\treturn &ProductPageServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewProductPageServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *ProductPageServiceClient {\n\treturn &ProductPageServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewProductPageServiceClient(c thrift.TClient) *ProductPageServiceClient {\n\treturn &ProductPageServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *ProductPageServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *ProductPageServiceClient) GetProduct(ctx context.Context, req *GetProductReq) (r *GetProductResp, err error) {\n\tvar _args ProductPageServiceGetProductArgs\n\t_args.Req = req\n\tvar _result ProductPageServiceGetProductResult\n\tif err = p.Client_().Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *ProductPageServiceClient) ListProducts(ctx context.Context, req *ListProductsReq) (r *ListProductsResp, err error) {\n\tvar _args ProductPageServiceListProductsArgs\n\t_args.Req = req\n\tvar _result ProductPageServiceListProductsResult\n\tif err = p.Client_().Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype ProductPageServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      ProductPageService\n}\n\nfunc (p *ProductPageServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *ProductPageServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *ProductPageServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewProductPageServiceProcessor(handler ProductPageService) *ProductPageServiceProcessor {\n\tself := &ProductPageServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"GetProduct\", &productPageServiceProcessorGetProduct{handler: handler})\n\tself.AddToProcessorMap(\"ListProducts\", &productPageServiceProcessorListProducts{handler: handler})\n\treturn self\n}\nfunc (p *ProductPageServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype productPageServiceProcessorGetProduct struct {\n\thandler ProductPageService\n}\n\nfunc (p *productPageServiceProcessorGetProduct) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ProductPageServiceGetProductArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"GetProduct\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ProductPageServiceGetProductResult{}\n\tvar retval *GetProductResp\n\tif retval, err2 = p.handler.GetProduct(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing GetProduct: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"GetProduct\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"GetProduct\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype productPageServiceProcessorListProducts struct {\n\thandler ProductPageService\n}\n\nfunc (p *productPageServiceProcessorListProducts) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ProductPageServiceListProductsArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"ListProducts\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ProductPageServiceListProductsResult{}\n\tvar retval *ListProductsResp\n\tif retval, err2 = p.handler.ListProducts(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing ListProducts: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"ListProducts\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"ListProducts\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype ProductPageServiceGetProductArgs struct {\n\tReq *GetProductReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewProductPageServiceGetProductArgs() *ProductPageServiceGetProductArgs {\n\treturn &ProductPageServiceGetProductArgs{}\n}\n\nvar ProductPageServiceGetProductArgs_Req_DEFAULT *GetProductReq\n\nfunc (p *ProductPageServiceGetProductArgs) GetReq() (v *GetProductReq) {\n\tif !p.IsSetReq() {\n\t\treturn ProductPageServiceGetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ProductPageServiceGetProductArgs) SetReq(val *GetProductReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ProductPageServiceGetProductArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ProductPageServiceGetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ProductPageServiceGetProductArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ProductPageServiceGetProductArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceGetProductArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewGetProductReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ProductPageServiceGetProductArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetProduct_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceGetProductArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceGetProductArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ProductPageServiceGetProductArgs(%+v)\", *p)\n}\n\nfunc (p *ProductPageServiceGetProductArgs) DeepEqual(ano *ProductPageServiceGetProductArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ProductPageServiceGetProductArgs) Field1DeepEqual(src *GetProductReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ProductPageServiceGetProductResult struct {\n\tSuccess *GetProductResp `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewProductPageServiceGetProductResult() *ProductPageServiceGetProductResult {\n\treturn &ProductPageServiceGetProductResult{}\n}\n\nvar ProductPageServiceGetProductResult_Success_DEFAULT *GetProductResp\n\nfunc (p *ProductPageServiceGetProductResult) GetSuccess() (v *GetProductResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ProductPageServiceGetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ProductPageServiceGetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*GetProductResp)\n}\n\nvar fieldIDToName_ProductPageServiceGetProductResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ProductPageServiceGetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ProductPageServiceGetProductResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ProductPageServiceGetProductResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceGetProductResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewGetProductResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ProductPageServiceGetProductResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"GetProduct_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceGetProductResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceGetProductResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ProductPageServiceGetProductResult(%+v)\", *p)\n}\n\nfunc (p *ProductPageServiceGetProductResult) DeepEqual(ano *ProductPageServiceGetProductResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ProductPageServiceGetProductResult) Field0DeepEqual(src *GetProductResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ProductPageServiceListProductsArgs struct {\n\tReq *ListProductsReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewProductPageServiceListProductsArgs() *ProductPageServiceListProductsArgs {\n\treturn &ProductPageServiceListProductsArgs{}\n}\n\nvar ProductPageServiceListProductsArgs_Req_DEFAULT *ListProductsReq\n\nfunc (p *ProductPageServiceListProductsArgs) GetReq() (v *ListProductsReq) {\n\tif !p.IsSetReq() {\n\t\treturn ProductPageServiceListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ProductPageServiceListProductsArgs) SetReq(val *ListProductsReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ProductPageServiceListProductsArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ProductPageServiceListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ProductPageServiceListProductsArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ProductPageServiceListProductsArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceListProductsArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewListProductsReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ProductPageServiceListProductsArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ListProducts_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceListProductsArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceListProductsArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ProductPageServiceListProductsArgs(%+v)\", *p)\n}\n\nfunc (p *ProductPageServiceListProductsArgs) DeepEqual(ano *ProductPageServiceListProductsArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ProductPageServiceListProductsArgs) Field1DeepEqual(src *ListProductsReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ProductPageServiceListProductsResult struct {\n\tSuccess *ListProductsResp `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewProductPageServiceListProductsResult() *ProductPageServiceListProductsResult {\n\treturn &ProductPageServiceListProductsResult{}\n}\n\nvar ProductPageServiceListProductsResult_Success_DEFAULT *ListProductsResp\n\nfunc (p *ProductPageServiceListProductsResult) GetSuccess() (v *ListProductsResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ProductPageServiceListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ProductPageServiceListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*ListProductsResp)\n}\n\nvar fieldIDToName_ProductPageServiceListProductsResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ProductPageServiceListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ProductPageServiceListProductsResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ProductPageServiceListProductsResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceListProductsResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewListProductsResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ProductPageServiceListProductsResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ListProducts_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceListProductsResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ProductPageServiceListProductsResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ProductPageServiceListProductsResult(%+v)\", *p)\n}\n\nfunc (p *ProductPageServiceListProductsResult) DeepEqual(ano *ProductPageServiceListProductsResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ProductPageServiceListProductsResult) Field0DeepEqual(src *ListProductsResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/product/productpageservice/client.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage productpageservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tGetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductPageServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductPageServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductPageServiceClient) GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, req)\n}\n\nfunc (p *kProductPageServiceClient) ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, req)\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/product/productpageservice/invoker.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage productpageservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductPageService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/product/productpageservice/productpageservice.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage productpageservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productPageServiceServiceInfo\n}\n\nvar productPageServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"ProductPageService\"\n\thandlerType := (*product.ProductPageService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"GetProduct\":   kitex.NewMethodInfo(getProductHandler, newProductPageServiceGetProductArgs, newProductPageServiceGetProductResult, false),\n\t\t\"ListProducts\": kitex.NewMethodInfo(listProductsHandler, newProductPageServiceListProductsArgs, newProductPageServiceListProductsResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"product\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.2\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*product.ProductPageServiceGetProductArgs)\n\trealResult := result.(*product.ProductPageServiceGetProductResult)\n\tsuccess, err := handler.(product.ProductPageService).GetProduct(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newProductPageServiceGetProductArgs() interface{} {\n\treturn product.NewProductPageServiceGetProductArgs()\n}\n\nfunc newProductPageServiceGetProductResult() interface{} {\n\treturn product.NewProductPageServiceGetProductResult()\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*product.ProductPageServiceListProductsArgs)\n\trealResult := result.(*product.ProductPageServiceListProductsResult)\n\tsuccess, err := handler.(product.ProductPageService).ListProducts(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newProductPageServiceListProductsArgs() interface{} {\n\treturn product.NewProductPageServiceListProductsArgs()\n}\n\nfunc newProductPageServiceListProductsResult() interface{} {\n\treturn product.NewProductPageServiceListProductsResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args product.ProductPageServiceGetProductArgs\n\t_args.Req = req\n\tvar _result product.ProductPageServiceGetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args product.ProductPageServiceListProductsArgs\n\t_args.Req = req\n\tvar _result product.ProductPageServiceListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/product/productpageservice/server.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\npackage productpageservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductPageService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/ratings/k-consts.go",
    "content": "package ratings\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/ratings/k-ratings.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage ratings\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/base\"\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n\t_ = base.KitexUnusedProtection\n)\n\nfunc (p *RatingReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductID bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductID = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_RatingReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_RatingReq[fieldId]))\n}\n\nfunc (p *RatingReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductID = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *RatingReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *RatingReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"RatingReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *RatingReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"RatingReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *RatingReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"ProductID\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.ProductID)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *RatingReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"ProductID\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.ProductID)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *RatingResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetRating bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetRating = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetRating {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_RatingResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_RatingResp[fieldId]))\n}\n\nfunc (p *RatingResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadByte(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Rating = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *RatingResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *RatingResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"RatingResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *RatingResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"RatingResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *RatingResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Rating\", thrift.BYTE, 1)\n\toffset += bthrift.Binary.WriteByte(buf[offset:], p.Rating)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *RatingResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Rating\", thrift.BYTE, 1)\n\tl += bthrift.Binary.ByteLength(p.Rating)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *RatingServiceRatingsArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_RatingServiceRatingsArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *RatingServiceRatingsArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRatingReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *RatingServiceRatingsArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *RatingServiceRatingsArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ratings_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *RatingServiceRatingsArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ratings_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *RatingServiceRatingsArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *RatingServiceRatingsArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *RatingServiceRatingsResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_RatingServiceRatingsResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *RatingServiceRatingsResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRatingResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *RatingServiceRatingsResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *RatingServiceRatingsResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ratings_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *RatingServiceRatingsResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ratings_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *RatingServiceRatingsResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *RatingServiceRatingsResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *RatingServiceRatingsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *RatingServiceRatingsResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/ratings/ratings.go",
    "content": "// Code generated by thriftgo (0.2.1). DO NOT EDIT.\n\npackage ratings\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype RatingReq struct {\n\tProductID string `thrift:\"ProductID,1,required\" json:\"ProductID\"`\n}\n\nfunc NewRatingReq() *RatingReq {\n\treturn &RatingReq{}\n}\n\nfunc (p *RatingReq) GetProductID() (v string) {\n\treturn p.ProductID\n}\nfunc (p *RatingReq) SetProductID(val string) {\n\tp.ProductID = val\n}\n\nvar fieldIDToName_RatingReq = map[int16]string{\n\t1: \"ProductID\",\n}\n\nfunc (p *RatingReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductID bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductID = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_RatingReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_RatingReq[fieldId]))\n}\n\nfunc (p *RatingReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductID = v\n\t}\n\treturn nil\n}\n\nfunc (p *RatingReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"RatingReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *RatingReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"ProductID\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.ProductID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *RatingReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"RatingReq(%+v)\", *p)\n}\n\nfunc (p *RatingReq) DeepEqual(ano *RatingReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductID) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *RatingReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.ProductID, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype RatingResp struct {\n\tRating int8 `thrift:\"Rating,1,required\" json:\"Rating\"`\n}\n\nfunc NewRatingResp() *RatingResp {\n\treturn &RatingResp{}\n}\n\nfunc (p *RatingResp) GetRating() (v int8) {\n\treturn p.Rating\n}\nfunc (p *RatingResp) SetRating(val int8) {\n\tp.Rating = val\n}\n\nvar fieldIDToName_RatingResp = map[int16]string{\n\t1: \"Rating\",\n}\n\nfunc (p *RatingResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetRating bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetRating = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetRating {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_RatingResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_RatingResp[fieldId]))\n}\n\nfunc (p *RatingResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadByte(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Rating = v\n\t}\n\treturn nil\n}\n\nfunc (p *RatingResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"RatingResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *RatingResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Rating\", thrift.BYTE, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteByte(p.Rating); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *RatingResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"RatingResp(%+v)\", *p)\n}\n\nfunc (p *RatingResp) DeepEqual(ano *RatingResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Rating) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *RatingResp) Field1DeepEqual(src int8) bool {\n\n\tif p.Rating != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype RatingService interface {\n\tRatings(ctx context.Context, req *RatingReq) (r *RatingResp, err error)\n}\n\ntype RatingServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewRatingServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *RatingServiceClient {\n\treturn &RatingServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewRatingServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *RatingServiceClient {\n\treturn &RatingServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewRatingServiceClient(c thrift.TClient) *RatingServiceClient {\n\treturn &RatingServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *RatingServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *RatingServiceClient) Ratings(ctx context.Context, req *RatingReq) (r *RatingResp, err error) {\n\tvar _args RatingServiceRatingsArgs\n\t_args.Req = req\n\tvar _result RatingServiceRatingsResult\n\tif err = p.Client_().Call(ctx, \"ratings\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype RatingServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      RatingService\n}\n\nfunc (p *RatingServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *RatingServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *RatingServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewRatingServiceProcessor(handler RatingService) *RatingServiceProcessor {\n\tself := &RatingServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"ratings\", &ratingServiceProcessorRatings{handler: handler})\n\treturn self\n}\nfunc (p *RatingServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype ratingServiceProcessorRatings struct {\n\thandler RatingService\n}\n\nfunc (p *ratingServiceProcessorRatings) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := RatingServiceRatingsArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"ratings\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := RatingServiceRatingsResult{}\n\tvar retval *RatingResp\n\tif retval, err2 = p.handler.Ratings(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing ratings: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"ratings\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"ratings\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype RatingServiceRatingsArgs struct {\n\tReq *RatingReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewRatingServiceRatingsArgs() *RatingServiceRatingsArgs {\n\treturn &RatingServiceRatingsArgs{}\n}\n\nvar RatingServiceRatingsArgs_Req_DEFAULT *RatingReq\n\nfunc (p *RatingServiceRatingsArgs) GetReq() (v *RatingReq) {\n\tif !p.IsSetReq() {\n\t\treturn RatingServiceRatingsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *RatingServiceRatingsArgs) SetReq(val *RatingReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_RatingServiceRatingsArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *RatingServiceRatingsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RatingServiceRatingsArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_RatingServiceRatingsArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *RatingServiceRatingsArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRatingReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *RatingServiceRatingsArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ratings_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *RatingServiceRatingsArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *RatingServiceRatingsArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"RatingServiceRatingsArgs(%+v)\", *p)\n}\n\nfunc (p *RatingServiceRatingsArgs) DeepEqual(ano *RatingServiceRatingsArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *RatingServiceRatingsArgs) Field1DeepEqual(src *RatingReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype RatingServiceRatingsResult struct {\n\tSuccess *RatingResp `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewRatingServiceRatingsResult() *RatingServiceRatingsResult {\n\treturn &RatingServiceRatingsResult{}\n}\n\nvar RatingServiceRatingsResult_Success_DEFAULT *RatingResp\n\nfunc (p *RatingServiceRatingsResult) GetSuccess() (v *RatingResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn RatingServiceRatingsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *RatingServiceRatingsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*RatingResp)\n}\n\nvar fieldIDToName_RatingServiceRatingsResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *RatingServiceRatingsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RatingServiceRatingsResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_RatingServiceRatingsResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *RatingServiceRatingsResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewRatingResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *RatingServiceRatingsResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ratings_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *RatingServiceRatingsResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *RatingServiceRatingsResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"RatingServiceRatingsResult(%+v)\", *p)\n}\n\nfunc (p *RatingServiceRatingsResult) DeepEqual(ano *RatingServiceRatingsResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *RatingServiceRatingsResult) Field0DeepEqual(src *RatingResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/ratings/ratingservice/client.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage ratingservice\n\nimport (\n\t\"context\"\n\tratings \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRatings(ctx context.Context, req *ratings.RatingReq, callOptions ...callopt.Option) (r *ratings.RatingResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kRatingServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kRatingServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kRatingServiceClient) Ratings(ctx context.Context, req *ratings.RatingReq, callOptions ...callopt.Option) (r *ratings.RatingResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Ratings(ctx, req)\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/ratings/ratingservice/invoker.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage ratingservice\n\nimport (\n\tratings \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler ratings.RatingService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/ratings/ratingservice/ratingservice.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage ratingservice\n\nimport (\n\t\"context\"\n\tratings \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn ratingServiceServiceInfo\n}\n\nvar ratingServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"RatingService\"\n\thandlerType := (*ratings.RatingService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"ratings\": kitex.NewMethodInfo(ratingsHandler, newRatingServiceRatingsArgs, newRatingServiceRatingsResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"ratings\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.2\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc ratingsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*ratings.RatingServiceRatingsArgs)\n\trealResult := result.(*ratings.RatingServiceRatingsResult)\n\tsuccess, err := handler.(ratings.RatingService).Ratings(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newRatingServiceRatingsArgs() interface{} {\n\treturn ratings.NewRatingServiceRatingsArgs()\n}\n\nfunc newRatingServiceRatingsResult() interface{} {\n\treturn ratings.NewRatingServiceRatingsResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Ratings(ctx context.Context, req *ratings.RatingReq) (r *ratings.RatingResp, err error) {\n\tvar _args ratings.RatingServiceRatingsArgs\n\t_args.Req = req\n\tvar _result ratings.RatingServiceRatingsResult\n\tif err = p.c.Call(ctx, \"ratings\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/ratings/ratingservice/server.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\npackage ratingservice\n\nimport (\n\tratings \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler ratings.RatingService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/reviews/k-consts.go",
    "content": "package reviews\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/reviews/k-reviews.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage reviews\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/base\"\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n\t_ = base.KitexUnusedProtection\n)\n\nfunc (p *Review) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetType bool = false\n\tvar issetRating bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetType = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetRating = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetType {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetRating {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Review[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_Review[fieldId]))\n}\n\nfunc (p *Review) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI32(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Type = ReviewType(v)\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Review) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadByte(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Rating = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Review) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Review) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Review\")\n\tif p != nil {\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Review) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Review\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Review) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Type\", thrift.I32, 1)\n\toffset += bthrift.Binary.WriteI32(buf[offset:], int32(p.Type))\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Review) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Rating\", thrift.BYTE, 2)\n\toffset += bthrift.Binary.WriteByte(buf[offset:], p.Rating)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Review) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Type\", thrift.I32, 1)\n\tl += bthrift.Binary.I32Length(int32(p.Type))\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Review) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Rating\", thrift.BYTE, 2)\n\tl += bthrift.Binary.ByteLength(p.Rating)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ReviewReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductID bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductID = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ReviewReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_ReviewReq[fieldId]))\n}\n\nfunc (p *ReviewReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ProductID = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ReviewReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ReviewReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ReviewReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ReviewReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ReviewReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ReviewReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"ProductID\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.ProductID)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ReviewReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"ProductID\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.ProductID)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ReviewResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetReview bool = false\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetReview = true\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetReview {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ReviewResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn offset, thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_ReviewResp[fieldId]))\n}\n\nfunc (p *ReviewResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewReview()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Review = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ReviewResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ReviewResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ReviewResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ReviewResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ReviewResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ReviewResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"Review\", thrift.STRUCT, 1)\n\toffset += p.Review.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ReviewResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"Review\", thrift.STRUCT, 1)\n\tl += p.Review.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ReviewsServiceReviewProductArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewReviewReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ReviewsServiceReviewProductArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ReviewProduct_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ReviewProduct_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *ReviewsServiceReviewProductResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ReviewsServiceReviewProductResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ReviewsServiceReviewProductResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewReviewResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *ReviewsServiceReviewProductResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *ReviewsServiceReviewProductResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"ReviewProduct_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *ReviewsServiceReviewProductResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"ReviewProduct_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *ReviewsServiceReviewProductResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *ReviewsServiceReviewProductResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *ReviewsServiceReviewProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/reviews/reviews.go",
    "content": "// Code generated by thriftgo (0.2.1). DO NOT EDIT.\n\npackage reviews\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"database/sql/driver\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype ReviewType int64\n\nconst (\n\tReviewType_Local ReviewType = 0\n\tReviewType_Blue  ReviewType = 1\n\tReviewType_Green ReviewType = 2\n)\n\nfunc (p ReviewType) String() string {\n\tswitch p {\n\tcase ReviewType_Local:\n\t\treturn \"Local\"\n\tcase ReviewType_Blue:\n\t\treturn \"Blue\"\n\tcase ReviewType_Green:\n\t\treturn \"Green\"\n\t}\n\treturn \"<UNSET>\"\n}\n\nfunc ReviewTypeFromString(s string) (ReviewType, error) {\n\tswitch s {\n\tcase \"Local\":\n\t\treturn ReviewType_Local, nil\n\tcase \"Blue\":\n\t\treturn ReviewType_Blue, nil\n\tcase \"Green\":\n\t\treturn ReviewType_Green, nil\n\t}\n\treturn ReviewType(0), fmt.Errorf(\"not a valid ReviewType string\")\n}\n\nfunc ReviewTypePtr(v ReviewType) *ReviewType { return &v }\nfunc (p *ReviewType) Scan(value interface{}) (err error) {\n\tvar result sql.NullInt64\n\terr = result.Scan(value)\n\t*p = ReviewType(result.Int64)\n\treturn\n}\n\nfunc (p *ReviewType) Value() (driver.Value, error) {\n\tif p == nil {\n\t\treturn nil, nil\n\t}\n\treturn int64(*p), nil\n}\n\ntype Review struct {\n\tType   ReviewType `thrift:\"Type,1,required\" json:\"Type\"`\n\tRating int8       `thrift:\"Rating,2,required\" json:\"Rating\"`\n}\n\nfunc NewReview() *Review {\n\treturn &Review{}\n}\n\nfunc (p *Review) GetType() (v ReviewType) {\n\treturn p.Type\n}\n\nfunc (p *Review) GetRating() (v int8) {\n\treturn p.Rating\n}\nfunc (p *Review) SetType(val ReviewType) {\n\tp.Type = val\n}\nfunc (p *Review) SetRating(val int8) {\n\tp.Rating = val\n}\n\nvar fieldIDToName_Review = map[int16]string{\n\t1: \"Type\",\n\t2: \"Rating\",\n}\n\nfunc (p *Review) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetType bool = false\n\tvar issetRating bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetType = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetRating = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetType {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\n\tif !issetRating {\n\t\tfieldId = 2\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Review[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_Review[fieldId]))\n}\n\nfunc (p *Review) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Type = ReviewType(v)\n\t}\n\treturn nil\n}\n\nfunc (p *Review) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadByte(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Rating = v\n\t}\n\treturn nil\n}\n\nfunc (p *Review) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Review\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Review) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Type\", thrift.I32, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI32(int32(p.Type)); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Review) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Rating\", thrift.BYTE, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteByte(p.Rating); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *Review) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Review(%+v)\", *p)\n}\n\nfunc (p *Review) DeepEqual(ano *Review) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Type) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Rating) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Review) Field1DeepEqual(src ReviewType) bool {\n\n\tif p.Type != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Review) Field2DeepEqual(src int8) bool {\n\n\tif p.Rating != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ReviewReq struct {\n\tProductID string `thrift:\"ProductID,1,required\" json:\"ProductID\"`\n}\n\nfunc NewReviewReq() *ReviewReq {\n\treturn &ReviewReq{}\n}\n\nfunc (p *ReviewReq) GetProductID() (v string) {\n\treturn p.ProductID\n}\nfunc (p *ReviewReq) SetProductID(val string) {\n\tp.ProductID = val\n}\n\nvar fieldIDToName_ReviewReq = map[int16]string{\n\t1: \"ProductID\",\n}\n\nfunc (p *ReviewReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetProductID bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetProductID = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetProductID {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ReviewReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_ReviewReq[fieldId]))\n}\n\nfunc (p *ReviewReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ProductID = v\n\t}\n\treturn nil\n}\n\nfunc (p *ReviewReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ReviewReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ReviewReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"ProductID\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.ProductID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ReviewReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ReviewReq(%+v)\", *p)\n}\n\nfunc (p *ReviewReq) DeepEqual(ano *ReviewReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.ProductID) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ReviewReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.ProductID, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ReviewResp struct {\n\tReview *Review `thrift:\"Review,1,required\" json:\"Review\"`\n}\n\nfunc NewReviewResp() *ReviewResp {\n\treturn &ReviewResp{}\n}\n\nvar ReviewResp_Review_DEFAULT *Review\n\nfunc (p *ReviewResp) GetReview() (v *Review) {\n\tif !p.IsSetReview() {\n\t\treturn ReviewResp_Review_DEFAULT\n\t}\n\treturn p.Review\n}\nfunc (p *ReviewResp) SetReview(val *Review) {\n\tp.Review = val\n}\n\nvar fieldIDToName_ReviewResp = map[int16]string{\n\t1: \"Review\",\n}\n\nfunc (p *ReviewResp) IsSetReview() bool {\n\treturn p.Review != nil\n}\n\nfunc (p *ReviewResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\tvar issetReview bool = false\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t\tissetReview = true\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\tif !issetReview {\n\t\tfieldId = 1\n\t\tgoto RequiredFieldNotSetError\n\t}\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ReviewResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\nRequiredFieldNotSetError:\n\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"required field %s is not set\", fieldIDToName_ReviewResp[fieldId]))\n}\n\nfunc (p *ReviewResp) ReadField1(iprot thrift.TProtocol) error {\n\tp.Review = NewReview()\n\tif err := p.Review.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ReviewResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ReviewResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ReviewResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"Review\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Review.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ReviewResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ReviewResp(%+v)\", *p)\n}\n\nfunc (p *ReviewResp) DeepEqual(ano *ReviewResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Review) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ReviewResp) Field1DeepEqual(src *Review) bool {\n\n\tif !p.Review.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ReviewsService interface {\n\tReviewProduct(ctx context.Context, req *ReviewReq) (r *ReviewResp, err error)\n}\n\ntype ReviewsServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewReviewsServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *ReviewsServiceClient {\n\treturn &ReviewsServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewReviewsServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *ReviewsServiceClient {\n\treturn &ReviewsServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewReviewsServiceClient(c thrift.TClient) *ReviewsServiceClient {\n\treturn &ReviewsServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *ReviewsServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *ReviewsServiceClient) ReviewProduct(ctx context.Context, req *ReviewReq) (r *ReviewResp, err error) {\n\tvar _args ReviewsServiceReviewProductArgs\n\t_args.Req = req\n\tvar _result ReviewsServiceReviewProductResult\n\tif err = p.Client_().Call(ctx, \"ReviewProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype ReviewsServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      ReviewsService\n}\n\nfunc (p *ReviewsServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *ReviewsServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *ReviewsServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewReviewsServiceProcessor(handler ReviewsService) *ReviewsServiceProcessor {\n\tself := &ReviewsServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"ReviewProduct\", &reviewsServiceProcessorReviewProduct{handler: handler})\n\treturn self\n}\nfunc (p *ReviewsServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype reviewsServiceProcessorReviewProduct struct {\n\thandler ReviewsService\n}\n\nfunc (p *reviewsServiceProcessorReviewProduct) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ReviewsServiceReviewProductArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"ReviewProduct\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ReviewsServiceReviewProductResult{}\n\tvar retval *ReviewResp\n\tif retval, err2 = p.handler.ReviewProduct(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing ReviewProduct: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"ReviewProduct\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"ReviewProduct\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype ReviewsServiceReviewProductArgs struct {\n\tReq *ReviewReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewReviewsServiceReviewProductArgs() *ReviewsServiceReviewProductArgs {\n\treturn &ReviewsServiceReviewProductArgs{}\n}\n\nvar ReviewsServiceReviewProductArgs_Req_DEFAULT *ReviewReq\n\nfunc (p *ReviewsServiceReviewProductArgs) GetReq() (v *ReviewReq) {\n\tif !p.IsSetReq() {\n\t\treturn ReviewsServiceReviewProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *ReviewsServiceReviewProductArgs) SetReq(val *ReviewReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_ReviewsServiceReviewProductArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ReviewsServiceReviewProductArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewReviewReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ReviewProduct_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ReviewsServiceReviewProductArgs(%+v)\", *p)\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) DeepEqual(ano *ReviewsServiceReviewProductArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ReviewsServiceReviewProductArgs) Field1DeepEqual(src *ReviewReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype ReviewsServiceReviewProductResult struct {\n\tSuccess *ReviewResp `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewReviewsServiceReviewProductResult() *ReviewsServiceReviewProductResult {\n\treturn &ReviewsServiceReviewProductResult{}\n}\n\nvar ReviewsServiceReviewProductResult_Success_DEFAULT *ReviewResp\n\nfunc (p *ReviewsServiceReviewProductResult) GetSuccess() (v *ReviewResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn ReviewsServiceReviewProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *ReviewsServiceReviewProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*ReviewResp)\n}\n\nvar fieldIDToName_ReviewsServiceReviewProductResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ReviewsServiceReviewProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ReviewsServiceReviewProductResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ReviewsServiceReviewProductResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ReviewsServiceReviewProductResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewReviewResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ReviewsServiceReviewProductResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"ReviewProduct_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ReviewsServiceReviewProductResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ReviewsServiceReviewProductResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ReviewsServiceReviewProductResult(%+v)\", *p)\n}\n\nfunc (p *ReviewsServiceReviewProductResult) DeepEqual(ano *ReviewsServiceReviewProductResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *ReviewsServiceReviewProductResult) Field0DeepEqual(src *ReviewResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/reviews/reviewsservice/client.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage reviewsservice\n\nimport (\n\t\"context\"\n\treviews \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tReviewProduct(ctx context.Context, req *reviews.ReviewReq, callOptions ...callopt.Option) (r *reviews.ReviewResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kReviewsServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kReviewsServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kReviewsServiceClient) ReviewProduct(ctx context.Context, req *reviews.ReviewReq, callOptions ...callopt.Option) (r *reviews.ReviewResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ReviewProduct(ctx, req)\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/reviews/reviewsservice/invoker.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage reviewsservice\n\nimport (\n\treviews \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler reviews.ReviewsService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/reviews/reviewsservice/reviewsservice.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\n\npackage reviewsservice\n\nimport (\n\t\"context\"\n\treviews \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn reviewsServiceServiceInfo\n}\n\nvar reviewsServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"ReviewsService\"\n\thandlerType := (*reviews.ReviewsService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"ReviewProduct\": kitex.NewMethodInfo(reviewProductHandler, newReviewsServiceReviewProductArgs, newReviewsServiceReviewProductResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"reviews\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.2\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc reviewProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*reviews.ReviewsServiceReviewProductArgs)\n\trealResult := result.(*reviews.ReviewsServiceReviewProductResult)\n\tsuccess, err := handler.(reviews.ReviewsService).ReviewProduct(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newReviewsServiceReviewProductArgs() interface{} {\n\treturn reviews.NewReviewsServiceReviewProductArgs()\n}\n\nfunc newReviewsServiceReviewProductResult() interface{} {\n\treturn reviews.NewReviewsServiceReviewProductResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ReviewProduct(ctx context.Context, req *reviews.ReviewReq) (r *reviews.ReviewResp, err error) {\n\tvar _args reviews.ReviewsServiceReviewProductArgs\n\t_args.Req = req\n\tvar _result reviews.ReviewsServiceReviewProductResult\n\tif err = p.c.Call(ctx, \"ReviewProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "bookinfo/kitex_gen/cwg/bookinfo/reviews/reviewsservice/server.go",
    "content": "// Code generated by Kitex v0.4.2. DO NOT EDIT.\npackage reviewsservice\n\nimport (\n\treviews \"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler reviews.ReviewsService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "bookinfo/licenses/LICENSE-cobra.txt",
    "content": "                                Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability."
  },
  {
    "path": "bookinfo/licenses/LICENSE-logrus.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Simon Eskildsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "bookinfo/licenses/LICENSE-opentelemetry-go.txt",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2016 The OpenTracing Authors\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "bookinfo/licenses/LICENSE-pflag.txt",
    "content": "Copyright (c) 2012 Alex Ogier. All rights reserved.\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "bookinfo/licenses/LICENSE-testify.txt",
    "content": "MIT License\n\nCopyright (c) 2012-2020 Mat Ryer, Tyler Bunnell and contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "bookinfo/licenses/LICENSE-thrift.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n--------------------------------------------------\nSOFTWARE DISTRIBUTED WITH THRIFT:\n\nThe Apache Thrift software includes a number of subcomponents with\nseparate copyright notices and license terms. Your use of the source\ncode for the these subcomponents is subject to the terms and\nconditions of the following licenses.\n\n--------------------------------------------------\nPortions of the following files are licensed under the MIT License:\n\n  lib/erl/src/Makefile.am\n\nPlease see doc/otp-base-license.txt for the full terms of this license.\n\n--------------------------------------------------\nFor the aclocal/ax_boost_base.m4 and contrib/fb303/aclocal/ax_boost_base.m4 components:\n\n#   Copyright (c) 2007 Thomas Porschberg <thomas@randspringer.de>\n#\n#   Copying and distribution of this file, with or without\n#   modification, are permitted in any medium without royalty provided\n#   the copyright notice and this notice are preserved.\n\n--------------------------------------------------\nFor the lib/nodejs/lib/thrift/json_parse.js:\n\n/*\n    json_parse.js\n    2015-05-02\n    Public Domain.\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n*/\n(By Douglas Crockford <douglas@crockford.com>)\n\n--------------------------------------------------\nFor lib/cpp/src/thrift/windows/SocketPair.cpp\n\n/* socketpair.c\n * Copyright 2007 by Nathan C. Myers <ncm@cantrip.org>; some rights reserved.\n * This code is Free Software.  It may be copied freely, in original or\n * modified form, subject only to the restrictions that (1) the author is\n * relieved from all responsibilities for any use for any purpose, and (2)\n * this copyright notice must be retained, unchanged, in its entirety.  If\n * for any reason the author might be held responsible for any consequences\n * of copying or use, license is withheld.\n */\n\n\n--------------------------------------------------\nFor lib/py/compat/win32/stdint.h\n\n// ISO C9x  compliant stdint.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124\n//\n//  Copyright (c) 2006-2008 Alexander Chemeris\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//\n//   3. The name of the author may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n\n--------------------------------------------------\nCodegen template in t_html_generator.h\n\n* Bootstrap v2.0.3\n*\n* Copyright 2012 Twitter, Inc\n* Licensed under the Apache License v2.0\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Designed and built with all the love in the world @twitter by @mdo and @fat.\n\n---------------------------------------------------\nFor t_cl_generator.cc\n\n * Copyright (c) 2008- Patrick Collison <patrick@collison.ie>\n * Copyright (c) 2006- Facebook\n\n---------------------------------------------------"
  },
  {
    "path": "bookinfo/licenses/LICENSE-viper.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Steve Francia\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "bookinfo/licenses/LICENSE-wire.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "bookinfo/manifest/bookinfo/traffic/bookinfo-gateway.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: bookinfo-gateway\nspec:\n  selector:\n    istio: ingressgateway # use istio default controller\n  servers:\n  - port:\n      number: 80\n      name: thrift\n      protocol: HTTP\n    hosts:\n    - \"*\"\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: bookinfo\nspec:\n  hosts:\n  - \"*\"\n  gateways:\n  - bookinfo-gateway\n  http:\n  - match:\n    - uri:\n        prefix: /\n    route:\n    - destination:\n        host: productpage\n        port:\n          number: 8081\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/traffic/canary.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n    - reviews\n  http:\n    - match:\n        - headers:\n            baggage:\n              exact: \"env=dev\"\n      route:\n        - destination:\n            host: reviews\n            subset: v2\n          weight: 100\n    - route:\n        - destination:\n            host: reviews\n            subset: v1\n          weight: 80\n        - destination:\n            host: reviews\n            subset: v3\n          weight: 20\n\n---\n\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: ratings\nspec:\n  hosts:\n    - ratings\n  http:\n    - match:\n        - headers:\n            baggage:\n              exact: \"env=dev\"\n      route:\n        - destination:\n            host: ratings\n            subset: v2\n          weight: 100\n    - route:\n        - destination:\n            host: ratings\n            subset: v1\n          weight: 100"
  },
  {
    "path": "bookinfo/manifest/bookinfo/traffic/destination-rule-all.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: productpage\nspec:\n  host: productpage\n  subsets:\n  - name: v1\n    labels:\n      version: v1\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: reviews\nspec:\n  host: reviews\n  subsets:\n  - name: v1\n    labels:\n      version: v1\n  - name: v2\n    labels:\n      version: v2\n  - name: v3\n    labels:\n      version: v3\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: ratings\nspec:\n  host: ratings\n  subsets:\n  - name: v1\n    labels:\n      version: v1\n  - name: v2\n    labels:\n      version: v2\n  - name: v2-mysql\n    labels:\n      version: v2-mysql\n  - name: v2-mysql-vm\n    labels:\n      version: v2-mysql-vm\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: details\nspec:\n  host: details\n  subsets:\n  - name: v1\n    labels:\n      version: v1\n  - name: v2\n    labels:\n      version: v2\n---\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/traffic/virtual-service-ratings-canary.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: ratings\nspec:\n  hosts:\n    - ratings\n  http:\n    - match:\n        - headers:\n            baggage:\n              exact: \"env=dev\"\n      route:\n        - destination:\n            host: ratings\n            subset: v2\n          weight: 100\n    - route:\n        - destination:\n            host: ratings\n          weight: 100"
  },
  {
    "path": "bookinfo/manifest/bookinfo/traffic/virtual-service-reviews-50-50.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n    - reviews\n  http:\n  - route:\n    - destination:\n        host: reviews\n        subset: v1\n      weight: 50\n    - destination:\n        host: reviews\n        subset: v2\n      weight: 50\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/traffic/virtual-service-reviews-80-20.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n    - reviews\n  http:\n  - route:\n    - destination:\n        host: reviews\n        subset: v1\n      weight: 80\n    - destination:\n        host: reviews\n        subset: v2\n      weight: 20\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/traffic/virtual-service-reviews-canary.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n    - reviews\n  http:\n    - match:\n        - headers:\n            baggage:\n              exact: \"env=dev\"\n      route:\n        - destination:\n            host: reviews\n            subset: v2\n          weight: 100\n    - route:\n        - destination:\n            host: reviews\n          weight: 100"
  },
  {
    "path": "bookinfo/manifest/bookinfo/traffic/virtual-service-reviews-v1.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n    - reviews\n  http:\n    - route:\n        - destination:\n            host: reviews\n            subset: v1"
  },
  {
    "path": "bookinfo/manifest/bookinfo/traffic/virtual-service-reviews-v2.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n    - reviews\n  http:\n    - route:\n        - destination:\n            host: reviews\n            subset: v2"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/Chart.yaml",
    "content": "apiVersion: v2\nname: bookinfo\ndescription: A Helm chart for bookinfo project\n\n# A chart can be either an 'application' or a 'library' chart.\n#\n# Application charts are a collection of templates that can be packaged into versioned archives\n# to be deployed.\n#\n# Library charts provide useful utilities or functions for the chart developer. They're included as\n# a dependency of application charts to inject those utilities and functions into the rendering\n# pipeline. Library charts do not define any templates and therefore cannot be deployed.\ntype: application\n\n# This is the chart version. This version number should be incremented each time you make changes\n# to the chart and its templates, including the app version.\n# Versions are expected to follow Semantic Versioning (https://semver.org/)\nversion: 0.1.0\n\n# This is the version number of the application being deployed. This version number should be\n# incremented each time you make changes to the application. Versions are not expected to\n# follow Semantic Versioning. They should reflect the version the application is using.\n# It is recommended to use it with quotes.\nappVersion: \"1.16.0\"\n\ndependencies:\n  - name: productpage\n    version: 0.1.0\n  - name: reviews\n    version: 0.1.0\n  - name: ratings\n    version: 0.1.0\n  - name: details\n    version: 0.1.0"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/details/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/details/Chart.yaml",
    "content": "apiVersion: v2\nname: details\ndescription: A Helm chart for Kubernetes\n\n# A chart can be either an 'application' or a 'library' chart.\n#\n# Application charts are a collection of templates that can be packaged into versioned archives\n# to be deployed.\n#\n# Library charts provide useful utilities or functions for the chart developer. They're included as\n# a dependency of application charts to inject those utilities and functions into the rendering\n# pipeline. Library charts do not define any templates and therefore cannot be deployed.\ntype: application\n\n# This is the chart version. This version number should be incremented each time you make changes\n# to the chart and its templates, including the app version.\n# Versions are expected to follow Semantic Versioning (https://semver.org/)\nversion: 0.1.0\n\n# This is the version number of the application being deployed. This version number should be\n# incremented each time you make changes to the application. Versions are not expected to\n# follow Semantic Versioning. They should reflect the version the application is using.\n# It is recommended to use it with quotes.\nappVersion: \"1.16.0\"\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/details/templates/NOTES.txt",
    "content": ""
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/details/templates/details.cm.yaml",
    "content": "apiVersion: v1\ndata:\n  {{ .Values.service.name }}.yaml: |\n    server:\n      addr: \"0.0.0.0:{{ .Values.service.port }}\"\nkind: ConfigMap\nmetadata:\n  name: {{ .Values.service.name }}\n\n\n\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/details/templates/details.svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  name: details\nspec:\n  ports:\n    - port: {{ .Values.service.port }}\n      protocol: TCP\n\n  selector:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  type: ClusterIP\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/details/templates/details.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n    version: v1\n  name: {{ .Values.service.name }}-v1\nspec:\n  progressDeadlineSeconds: 600\n  replicas: 1\n  revisionHistoryLimit: 10\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: {{ .Values.service.name }}\n      app.kubernetes.io/name: {{ .Values.service.name }}\n      version: v1\n  template:\n    metadata:\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        checksum/config: {{ include (print $.Template.BasePath \"/details.cm.yaml\") . | sha256sum }}\n      labels:\n        app.kubernetes.io/instance: {{ .Values.service.name }}\n        app.kubernetes.io/name: {{ .Values.service.name }}\n        version: v1\n    spec:\n      containers:\n        - args:\n            - {{ .Values.service.name }}\n            - --config=config/{{ .Values.service.name }}.yaml\n          env:\n            - name: OTEL_RESOURCE_ATTRIBUTES\n              value: service.version=v1\n            - name: OTEL_EXPORTER_OTLP_ENDPOINT\n              value: {{ .Values.global.otel.endpoint }}\n            - name: TZ\n              value: Asia/Shanghai\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: INSTANCE_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: METRICS_LOG_LEVEL\n              value: err\n            - name: ISTIO_META_CLUSTER_ID\n              value: {{ .Values.global.multiCluster.clusterName }}\n\n          image: {{ .Values.global.image }}\n          imagePullPolicy: Always\n          name: server\n          ports:\n            - containerPort: {{ .Values.service.port }}\n              protocol: TCP\n          resources:\n            limits:\n              cpu: 500m\n              memory: 1Gi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n          volumeMounts:\n            - mountPath: /app/config\n              name: config-volume\n      restartPolicy: Always\n      serviceAccountName: default\n      volumes:\n        - configMap:\n            defaultMode: 420\n            name: {{ .Values.service.name }}\n          name: config-volume\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/details/values.yaml",
    "content": "service:\n  name: details\n  port: 8084\n\nimage: cr-cn-beijing.volces.com/proxyless-test/bookinfo\n\notel:\n  endpoint: http://host.docker.internal:4317"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/productpage/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/productpage/Chart.yaml",
    "content": "apiVersion: v2\nname: productpage\ndescription: A Helm chart for Kubernetes\n\n# A chart can be either an 'application' or a 'library' chart.\n#\n# Application charts are a collection of templates that can be packaged into versioned archives\n# to be deployed.\n#\n# Library charts provide useful utilities or functions for the chart developer. They're included as\n# a dependency of application charts to inject those utilities and functions into the rendering\n# pipeline. Library charts do not define any templates and therefore cannot be deployed.\ntype: application\n\n# This is the chart version. This version number should be incremented each time you make changes\n# to the chart and its templates, including the app version.\n# Versions are expected to follow Semantic Versioning (https://semver.org/)\nversion: 0.1.0\n\n# This is the version number of the application being deployed. This version number should be\n# incremented each time you make changes to the application. Versions are not expected to\n# follow Semantic Versioning. They should reflect the version the application is using.\n# It is recommended to use it with quotes.\nappVersion: \"1.16.0\"\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/productpage/templates/NOTES.txt",
    "content": ""
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/productpage/templates/productpage.cm.yaml",
    "content": "apiVersion: v1\ndata:\n  {{ .Values.service.name }}.yaml: |\n    server:\n      addr: \"0.0.0.0:{{ .Values.service.port }}\"\n    reviews:\n      endpoint: {{ .Values.upstreamServices.reviews.endpoints }}\n      enableXDS: {{ .Values.upstreamServices.reviews.enableXDS }}\n      xdsAddr: {{ .Values.global.xdsAddr }}\n      xdsAuth: {{ .Values.global.xdsAuth }}\n    details:\n      endpoint: {{ .Values.upstreamServices.details.endpoint }}\nkind: ConfigMap\nmetadata:\n  name: {{ .Values.service.name }}\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/productpage/templates/productpage.svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  name: {{ .Values.service.name }}\nspec:\n  ports:\n    - port: {{ .Values.service.port }}\n      protocol: TCP\n\n  selector:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  type: ClusterIP\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/productpage/templates/productpage.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n    version: v1\n  name: {{ .Values.service.name }}-v1\nspec:\n  progressDeadlineSeconds: 600\n  replicas: 1\n  revisionHistoryLimit: 10\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: {{ .Values.service.name }}\n      app.kubernetes.io/name: {{ .Values.service.name }}\n      version: v1\n  template:\n    metadata:\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        checksum/config: {{ include (print $.Template.BasePath \"/productpage.cm.yaml\") . | sha256sum }}\n      labels:\n        app.kubernetes.io/instance: {{ .Values.service.name }}\n        app.kubernetes.io/name: {{ .Values.service.name }}\n        version: v1\n    spec:\n      containers:\n        - args:\n            - {{ .Values.service.name }}\n            - --config=config/{{ .Values.service.name }}.yaml\n          env:\n            - name: OTEL_RESOURCE_ATTRIBUTES\n              value: service.version=v1\n            - name: OTEL_EXPORTER_OTLP_ENDPOINT\n              value: {{ .Values.global.otel.endpoint }}\n            - name: TZ\n              value: Asia/Shanghai\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: INSTANCE_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: METRICS_LOG_LEVEL\n              value: err\n            - name: ISTIO_META_CLUSTER_ID\n              value: {{ .Values.global.multiCluster.clusterName }}\n\n          image: {{ .Values.global.image }}\n          imagePullPolicy: Always\n          name: server\n          ports:\n            - containerPort: {{ .Values.service.port }}\n              protocol: TCP\n          resources:\n            limits:\n              cpu: 500m\n              memory: 1Gi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n          volumeMounts:\n            - mountPath: /app/config\n              name: config-volume\n      restartPolicy: Always\n      serviceAccountName: default\n      volumes:\n        - configMap:\n            defaultMode: 420\n            name: {{ .Values.service.name }}\n          name: config-volume\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/productpage/values.yaml",
    "content": "service:\n  name: productpage\n  port: 8081\n\nimage: cr-cn-beijing.volces.com/proxyless-test/bookinfo\n\nupstreamServices:\n  reviews:\n    endpoints: reviews.default.svc.cluster.local:8082\n    enableXDS: true\n  details:\n    endpoint: details.default.svc.cluster.local:8084\n\notel:\n  endpoint: http://host.docker.internal:4317"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/ratings/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/ratings/Chart.yaml",
    "content": "apiVersion: v2\nname: ratings\ndescription: A Helm chart for Kubernetes\n\n# A chart can be either an 'application' or a 'library' chart.\n#\n# Application charts are a collection of templates that can be packaged into versioned archives\n# to be deployed.\n#\n# Library charts provide useful utilities or functions for the chart developer. They're included as\n# a dependency of application charts to inject those utilities and functions into the rendering\n# pipeline. Library charts do not define any templates and therefore cannot be deployed.\ntype: application\n\n# This is the chart version. This version number should be incremented each time you make changes\n# to the chart and its templates, including the app version.\n# Versions are expected to follow Semantic Versioning (https://semver.org/)\nversion: 0.1.0\n\n# This is the version number of the application being deployed. This version number should be\n# incremented each time you make changes to the application. Versions are not expected to\n# follow Semantic Versioning. They should reflect the version the application is using.\n# It is recommended to use it with quotes.\nappVersion: \"1.16.0\"\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/ratings/templates/NOTES.txt",
    "content": ""
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/ratings/templates/ratings-v1.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  name: {{ .Values.service.name }}-v1\nspec:\n  progressDeadlineSeconds: 600\n  replicas: 1\n  revisionHistoryLimit: 10\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: {{ .Values.service.name }}\n      app.kubernetes.io/name: {{ .Values.service.name }}\n      version: v1\n  template:\n    metadata:\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        checksum/config: {{ include (print $.Template.BasePath \"/ratings.cm.yaml\") . | sha256sum }}\n      labels:\n        app.kubernetes.io/instance: {{ .Values.service.name }}\n        app.kubernetes.io/name: {{ .Values.service.name }}\n        version: v1\n    spec:\n      containers:\n        - args:\n            - {{ .Values.service.name }}\n            - --config=config/{{ .Values.service.name }}.yaml\n          env:\n            - name: OTEL_RESOURCE_ATTRIBUTES\n              value: service.version=v1\n            - name: OTEL_EXPORTER_OTLP_ENDPOINT\n              value: {{ .Values.global.otel.endpoint }}\n            - name: RATINGS_VALUE\n              value: \"1\"\n            - name: TZ\n              value: Asia/Shanghai\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  apiVersion: v1\n                  fieldPath: metadata.name\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  apiVersion: v1\n                  fieldPath: metadata.namespace\n            - name: CONSUL_HTTP_HOST\n              valueFrom:\n                fieldRef:\n                  apiVersion: v1\n                  fieldPath: status.hostIP\n            - name: METRICS_LOG_LEVEL\n              value: err\n          image: {{ .Values.global.image }}\n          imagePullPolicy: Always\n          name: server\n          ports:\n          - containerPort: {{ .Values.service.port }}\n            protocol: TCP\n          resources:\n            limits:\n              cpu: 500m\n              memory: 1Gi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n          volumeMounts:\n            - mountPath: /app/config\n              name: config-volume\n      restartPolicy: Always\n      serviceAccountName: default\n      volumes:\n        - configMap:\n            defaultMode: 420\n            name: {{ .Values.service.name }}\n          name: config-volume\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/ratings/templates/ratings-v2.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  name: {{ .Values.service.name }}-v2\nspec:\n  progressDeadlineSeconds: 600\n  replicas: 1\n  revisionHistoryLimit: 10\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: {{ .Values.service.name }}\n      app.kubernetes.io/name: {{ .Values.service.name }}\n      version: v2\n  template:\n    metadata:\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n      labels:\n        app.kubernetes.io/instance: {{ .Values.service.name }}\n        app.kubernetes.io/name: {{ .Values.service.name }}\n        version: v2\n    spec:\n      containers:\n        - args:\n            - {{ .Values.service.name }}\n            - --config=config/{{ .Values.service.name }}.yaml\n          env:\n            - name: OTEL_RESOURCE_ATTRIBUTES\n              value: service.version=v2\n            - name: OTEL_EXPORTER_OTLP_ENDPOINT\n              value: {{ .Values.global.otel.endpoint }}\n            - name: RATINGS_VALUE\n              value: \"5\"\n            - name: TZ\n              value: Asia/Shanghai\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: INSTANCE_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: METRICS_LOG_LEVEL\n              value: err\n            - name: CONSUL_HTTP_HOST\n              valueFrom:\n                fieldRef:\n                  apiVersion: v1\n                  fieldPath: status.hostIP\n          image: {{ .Values.global.image }}\n          imagePullPolicy: Always\n          name: server\n          ports:\n          - containerPort: {{ .Values.service.port }}\n            protocol: TCP\n          resources:\n            limits:\n              cpu: 500m\n              memory: 1Gi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n          volumeMounts:\n            - mountPath: /app/config\n              name: config-volume\n      restartPolicy: Always\n      serviceAccountName: default\n      volumes:\n        - configMap:\n            defaultMode: 420\n            name: {{ .Values.service.name }}\n          name: config-volume\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/ratings/templates/ratings.cm.yaml",
    "content": "apiVersion: v1\ndata:\n  {{ .Values.service.name }}.yaml: |\n    server:\n      addr: \"0.0.0.0:{{ .Values.service.port }}\"\nkind: ConfigMap\nmetadata:\n  name: {{ .Values.service.name }}\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/ratings/templates/ratings.svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  name: {{ .Values.service.name }}\nspec:\n  ports:\n    - port: {{ .Values.service.port }}\n      protocol: TCP\n\n  selector:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  type: ClusterIP\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/ratings/values.yaml",
    "content": "service:\n  name: ratings\n  port: 8083\n\nupstreamServices:\n  ratings:\n    endpoints: ratings.default.svc.cluster.local:8083\n    enableXDS: true\n\nimage: cr-cn-beijing.volces.com/proxyless-test/bookinfo"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/reviews/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/reviews/Chart.yaml",
    "content": "apiVersion: v2\nname: reviews\ndescription: A Helm chart for Kubernetes\n\n# A chart can be either an 'application' or a 'library' chart.\n#\n# Application charts are a collection of templates that can be packaged into versioned archives\n# to be deployed.\n#\n# Library charts provide useful utilities or functions for the chart developer. They're included as\n# a dependency of application charts to inject those utilities and functions into the rendering\n# pipeline. Library charts do not define any templates and therefore cannot be deployed.\ntype: application\n\n# This is the chart version. This version number should be incremented each time you make changes\n# to the chart and its templates, including the app version.\n# Versions are expected to follow Semantic Versioning (https://semver.org/)\nversion: 0.1.0\n\n# This is the version number of the application being deployed. This version number should be\n# incremented each time you make changes to the application. Versions are not expected to\n# follow Semantic Versioning. They should reflect the version the application is using.\n# It is recommended to use it with quotes.\nappVersion: \"1.16.0\"\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/reviews/templates/NOTES.txt",
    "content": ""
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/reviews/templates/reviews-v1.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  name: {{ .Values.service.name }}-v1\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: {{ .Values.service.name }}\n      app.kubernetes.io/name: {{ .Values.service.name }}\n      version: v1\n  template:\n    metadata:\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        checksum/config: {{ include (print $.Template.BasePath \"/reviews.cm.yaml\") . | sha256sum }}\n      labels:\n        app.kubernetes.io/instance: {{ .Values.service.name }}\n        app.kubernetes.io/name: {{ .Values.service.name }}\n        version: v1\n    spec:\n      containers:\n        - args:\n            - {{ .Values.service.name }}\n            - --config=config/{{ .Values.service.name }}.yaml\n          env:\n            - name: OTEL_RESOURCE_ATTRIBUTES\n              value: service.version=v1\n            - name: OTEL_EXPORTER_OTLP_ENDPOINT\n              value: {{ .Values.global.otel.endpoint }}\n            - name: ENABLE_RATINGS\n              value: \"enable\"\n            - name: TZ\n              value: Asia/Shanghai\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: INSTANCE_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: METRICS_LOG_LEVEL\n              value: err\n            - name: CONSUL_HTTP_HOST\n              valueFrom:\n                fieldRef:\n                  apiVersion: v1\n                  fieldPath: status.hostIP\n            - name: ISTIO_META_CLUSTER_ID\n              value: {{ .Values.global.multiCluster.clusterName }}\n\n          image: {{ .Values.global.image }}\n          imagePullPolicy: Always\n          name: server\n          ports:\n          - containerPort: {{ .Values.service.port }}\n            protocol: TCP\n          resources:\n            limits:\n              cpu: 500m\n              memory: 1Gi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n          volumeMounts:\n            - mountPath: /app/config\n              name: config-volume\n      restartPolicy: Always\n      serviceAccountName: default\n      volumes:\n        - configMap:\n            defaultMode: 420\n            name: {{ .Values.service.name }}\n          name: config-volume\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/reviews/templates/reviews-v2.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  name: {{ .Values.service.name }}-v2\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: {{ .Values.service.name }}\n      app.kubernetes.io/name: {{ .Values.service.name }}\n      version: v2\n  template:\n    metadata:\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        checksum/config: {{ include (print $.Template.BasePath \"/reviews.cm.yaml\") . | sha256sum }}\n      labels:\n        app.kubernetes.io/instance: {{ .Values.service.name }}\n        app.kubernetes.io/name: {{ .Values.service.name }}\n        version: v2\n    spec:\n      containers:\n        - args:\n            - {{ .Values.service.name }}\n            - --config=config/{{ .Values.service.name }}.yaml\n          env:\n            - name: OTEL_RESOURCE_ATTRIBUTES\n              value: service.version=v2\n            - name: OTEL_EXPORTER_OTLP_ENDPOINT\n              value: {{ .Values.global.otel.endpoint }}\n            - name: ENABLE_RATINGS\n              value: \"enable\"\n            - name: TZ\n              value: Asia/Shanghai\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: INSTANCE_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: METRICS_LOG_LEVEL\n              value: err\n            - name: CONSUL_HTTP_HOST\n              valueFrom:\n                fieldRef:\n                  apiVersion: v1\n                  fieldPath: status.hostIP\n            - name: ISTIO_META_CLUSTER_ID\n              value: {{ .Values.global.multiCluster.clusterName }}\n          image: {{ .Values.global.image }}\n          imagePullPolicy: Always\n          name: server\n          ports:\n          - containerPort: {{ .Values.service.port }}\n            protocol: TCP\n          resources:\n            limits:\n              cpu: 500m\n              memory: 1Gi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n          volumeMounts:\n            - mountPath: /app/config\n              name: config-volume\n      restartPolicy: Always\n      serviceAccountName: default\n      volumes:\n        - configMap:\n            defaultMode: 420\n            name: {{ .Values.service.name }}\n          name: config-volume\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/reviews/templates/reviews-v3.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  name: {{ .Values.service.name }}-v3\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: {{ .Values.service.name }}\n      app.kubernetes.io/name: {{ .Values.service.name }}\n      version: v3\n  template:\n    metadata:\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        checksum/config: {{ include (print $.Template.BasePath \"/reviews.cm.yaml\") . | sha256sum }}\n      labels:\n        app.kubernetes.io/instance: {{ .Values.service.name }}\n        app.kubernetes.io/name: {{ .Values.service.name }}\n        version: v3\n    spec:\n      containers:\n        - args:\n            - {{ .Values.service.name }}\n            - --config=config/{{ .Values.service.name }}.yaml\n          env:\n            - name: OTEL_RESOURCE_ATTRIBUTES\n              value: service.version=v3\n            - name: OTEL_EXPORTER_OTLP_ENDPOINT\n              value: {{ .Values.global.otel.endpoint }}\n            - name: ENABLE_RATINGS\n              value: \"disable\"\n            - name: TZ\n              value: Asia/Shanghai\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: INSTANCE_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: METRICS_LOG_LEVEL\n              value: err\n            - name: CONSUL_HTTP_HOST\n              valueFrom:\n                fieldRef:\n                  apiVersion: v1\n                  fieldPath: status.hostIP\n            - name: ISTIO_META_CLUSTER_ID\n              value: {{ .Values.global.multiCluster.clusterName }}\n          image: {{ .Values.global.image }}\n          imagePullPolicy: Always\n          name: server\n          ports:\n          - containerPort: {{ .Values.service.port }}\n            protocol: TCP\n          resources:\n            limits:\n              cpu: 500m\n              memory: 1Gi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n          volumeMounts:\n            - mountPath: /app/config\n              name: config-volume\n      restartPolicy: Always\n      serviceAccountName: default\n      volumes:\n        - configMap:\n            defaultMode: 420\n            name: {{ .Values.service.name }}\n          name: config-volume\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/reviews/templates/reviews.cm.yaml",
    "content": "apiVersion: v1\ndata:\n  {{ .Values.service.name }}.yaml: |\n    server:\n      addr: \"0.0.0.0:{{ .Values.service.port }}\"\n      logLevel: {{ .Values.service.logLevel }}\n    ratings:\n      endpoint: {{ .Values.upstreamServices.ratings.endpoints }}\n      enableXDS: {{ .Values.upstreamServices.ratings.enableXDS }}\n      xdsAddr: {{ .Values.global.xdsAddr }}\n      xdsAuth: {{ .Values.global.xdsAuth }}\nkind: ConfigMap\nmetadata:\n  name: {{ .Values.service.name }}\n\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/reviews/templates/reviews.svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  name: {{ .Values.service.name }}\nspec:\n  ports:\n    - port: {{ .Values.service.port }}\n\n      protocol: TCP\n  selector:\n    app.kubernetes.io/instance: {{ .Values.service.name }}\n    app.kubernetes.io/name: {{ .Values.service.name }}\n  type: ClusterIP\n"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/charts/reviews/values.yaml",
    "content": "service:\n  name: reviews\n  port: 8082\n  logLevel: debug\n\nupstreamServices:\n  ratings:\n    endpoints: ratings.default.svc.cluster.local:8083\n    enableXDS: true\n\nimage: cr-cn-beijing.volces.com/proxyless-test/bookinfo\n\notel:\n  endpoint: http://host.docker.internal:4317"
  },
  {
    "path": "bookinfo/manifest/bookinfo/workloads/values.yaml",
    "content": "global:\n  image: cr-cn-beijing.volces.com/cloudwego-demo/bookinfo:v1.0\n  multiCluster:\n    clusterName: \"\" # Get the value using \"kubectl config get-clusters\"\n  xdsAddr: istiod.istio-system.svc:15010 # Set the address of the xDS Server\n  xdsAuth: false\n  otel:\n    endpoint: http://bookinfo-demo-collector:4317"
  },
  {
    "path": "bookinfo/pkg/configparser/config.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage configparser\n\n// Provider is config provider\ntype Provider interface {\n\t// Get returns the Parser if succeed or error otherwise.\n\tGet() (*Parser, error)\n}\n\n// Default is a default config provider\nfunc Default() Provider {\n\treturn NewFile()\n}\n"
  },
  {
    "path": "bookinfo/pkg/configparser/parser.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage configparser\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/spf13/viper\"\n)\n\n// Parser loads configuration.\ntype Parser struct {\n\tv *viper.Viper\n}\n\nfunc newViper() *viper.Viper {\n\treturn viper.NewWithOptions()\n}\n\n// UnmarshalExact unmarshals the config into a struct, erroring if a field is nonexistent.\nfunc (l *Parser) UnmarshalExact(intoCfg interface{}) error {\n\treturn l.v.UnmarshalExact(intoCfg)\n}\n\n// NewParserFromFile creates a new Parser by reading the given file.\nfunc NewParserFromFile(fileName string) (*Parser, error) {\n\tv := newViper()\n\tv.SetConfigFile(fileName)\n\tif err := v.ReadInConfig(); err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to read the file %v: %w\", fileName, err)\n\t}\n\treturn &Parser{v: v}, nil\n}\n"
  },
  {
    "path": "bookinfo/pkg/configparser/provider_file.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage configparser\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\ntype fileProvider struct{}\n\n// NewFile create file provider\nfunc NewFile() Provider {\n\treturn &fileProvider{}\n}\n\n// Get file provider\nfunc (fl *fileProvider) Get() (*Parser, error) {\n\tfileName := getConfigFlag()\n\tif fileName == \"\" {\n\t\treturn nil, errors.New(\"config file not specified\")\n\t}\n\n\tcp, err := NewParserFromFile(fileName)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error loading config file %q: %v\", fileName, err)\n\t}\n\n\treturn cp, nil\n}\n"
  },
  {
    "path": "bookinfo/pkg/configparser/provider_flags.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage configparser\n\nimport (\n\t\"github.com/spf13/pflag\"\n)\n\nconst (\n\tconfigFlagName = \"config\"\n)\n\nvar configFlag *string\n\n// Flags adds flags related to basic configuration's parser loader to the flags.\nfunc Flags(flags *pflag.FlagSet) {\n\tconfigFlag = flags.String(configFlagName, \"\", \"Path to the config file\")\n}\n\nfunc getConfigFlag() string {\n\treturn *configFlag\n}\n"
  },
  {
    "path": "bookinfo/pkg/constants/env.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage constants\n\nconst (\n\t// EnableRatingsEnvKey enable ratings env key\n\tEnableRatingsEnvKey = \"ENABLE_RATINGS\"\n\t// RatingsValueEnvKey ratings value env key\n\tRatingsValueEnvKey = \"RATINGS_VALUE\"\n)\n\nconst (\n\tEnable  = \"enable\"\n\tDisable = \"disable\"\n)\n"
  },
  {
    "path": "bookinfo/pkg/constants/service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage constants\n\nconst (\n\t// RatingsServiceName ratings service name\n\tRatingsServiceName = \"ratings\"\n\t// ProductpageServiceName productpage service name\n\tProductpageServiceName = \"productpage\"\n\t// ReviewsServiceName reviews service name\n\tReviewsServiceName = \"reviews\"\n\t// DetailsServiceName details service name\n\tDetailsServiceName = \"details\"\n)\n\nconst (\n\t// IstiodSvrName istiod svr name\n\tIstiodSvrName = \"istiod.istio-system.svc\"\n)\n"
  },
  {
    "path": "bookinfo/pkg/injectors/provide_details.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage injectors\n\nimport (\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/details/detailsservice\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/constants\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/metadata\"\n\tkclient \"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/xds\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\txdsmanager \"github.com/kitex-contrib/xds\"\n\t\"github.com/kitex-contrib/xds/core/manager\"\n\t\"github.com/kitex-contrib/xds/xdssuite\"\n)\n\n// DetailsClientOptions detail client options\ntype DetailsClientOptions struct {\n\tEndpoint  string `mapstructure:\"endpoint\"`\n\tEnableXDS bool   `mapstructure:\"enableXDS\"`\n\tXDSAddr   string `mapstructure:\"xdsAddr\"`\n\tXDSAuth   bool   `mapstructure:\"xdsAuth\"`\n}\n\n// DefaultDetailsClientOptions default options\nfunc DefaultDetailsClientOptions() *DetailsClientOptions {\n\treturn &DetailsClientOptions{\n\t\tEndpoint:  \"details:8084\",\n\t\tEnableXDS: false,\n\t\tXDSAddr:   \"istiod.istio-system.svc:15012\",\n\t\tXDSAuth:   true,\n\t}\n}\n\n// ProvideDetailsClient provide details client\n// 1、init xds manager: only init once\n// 2、enable xds\n// 3、enable opentelemetry\nfunc ProvideDetailsClient(opts *DetailsClientOptions) (detailsservice.Client, error) {\n\tif opts.EnableXDS {\n\t\tif err := xdsmanager.Init(\n\t\t\txdsmanager.WithXDSServerConfig(&manager.XDSServerConfig{\n\t\t\t\tSvrName: constants.IstiodSvrName,\n\t\t\t\tSvrAddr: opts.XDSAddr,\n\t\t\t\tXDSAuth: opts.XDSAuth,\n\t\t\t}),\n\t\t); err != nil {\n\t\t\tklog.Fatal(err)\n\t\t}\n\t\treturn detailsservice.NewClient(\n\t\t\topts.Endpoint,\n\t\t\tkclient.WithSuite(tracing.NewClientSuite()),\n\t\t\tkclient.WithXDSSuite(xds.ClientSuite{\n\t\t\t\tRouterMiddleware: xdssuite.NewXDSRouterMiddleware(\n\t\t\t\t\txdssuite.WithRouterMetaExtractor(metadata.ExtractFromPropagator),\n\t\t\t\t),\n\t\t\t\tResolver: xdssuite.NewXDSResolver(),\n\t\t\t}),\n\t\t)\n\t}\n\n\treturn detailsservice.NewClient(\n\t\tconstants.DetailsServiceName,\n\t\tkclient.WithHostPorts(opts.Endpoint),\n\t\tkclient.WithSuite(tracing.NewClientSuite()),\n\t)\n}\n"
  },
  {
    "path": "bookinfo/pkg/injectors/provide_ratings.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage injectors\n\nimport (\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/ratings/ratingservice\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/constants\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/metadata\"\n\tkclient \"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/xds\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\txdsmanager \"github.com/kitex-contrib/xds\"\n\t\"github.com/kitex-contrib/xds/core/manager\"\n\t\"github.com/kitex-contrib/xds/xdssuite\"\n)\n\n// RatingsClientOptions client options\ntype RatingsClientOptions struct {\n\tEndpoint  string `mapstructure:\"endpoint\"`\n\tEnableXDS bool   `mapstructure:\"enableXDS\"`\n\tXDSAddr   string `mapstructure:\"xdsAddr\"`\n\tXDSAuth   bool   `mapstructure:\"xdsAuth\"`\n}\n\nfunc DefaultRatingsClientOptions() *RatingsClientOptions {\n\treturn &RatingsClientOptions{\n\t\tEndpoint:  \"ratings:8083\",\n\t\tEnableXDS: false,\n\t\tXDSAddr:   \"istiod.istio-system.svc:15012\",\n\t\tXDSAuth:   true,\n\t}\n}\n\n// ProvideRatingsClient provide ratings client\n// 1、init xds manager: only init once\n// 2、enable xds\n// 3、enable opentelemetry\nfunc ProvideRatingsClient(opts *RatingsClientOptions) (ratingservice.Client, error) {\n\tif opts.EnableXDS {\n\t\tif err := xdsmanager.Init(\n\t\t\txdsmanager.WithXDSServerConfig(&manager.XDSServerConfig{\n\t\t\t\tSvrName: constants.IstiodSvrName,\n\t\t\t\tSvrAddr: opts.XDSAddr,\n\t\t\t\tXDSAuth: opts.XDSAuth,\n\t\t\t}),\n\t\t); err != nil {\n\t\t\tklog.Fatal(err)\n\t\t}\n\t\treturn ratingservice.NewClient(\n\t\t\topts.Endpoint,\n\t\t\tkclient.WithSuite(tracing.NewClientSuite()),\n\t\t\tkclient.WithXDSSuite(xds.ClientSuite{\n\t\t\t\tRouterMiddleware: xdssuite.NewXDSRouterMiddleware(\n\t\t\t\t\txdssuite.WithRouterMetaExtractor(metadata.ExtractFromPropagator),\n\t\t\t\t),\n\t\t\t\tResolver: xdssuite.NewXDSResolver(),\n\t\t\t}),\n\t\t)\n\t}\n\n\treturn ratingservice.NewClient(\n\t\tconstants.RatingsServiceName,\n\t\tkclient.WithHostPorts(opts.Endpoint),\n\t\tkclient.WithSuite(tracing.NewClientSuite()),\n\t)\n}\n"
  },
  {
    "path": "bookinfo/pkg/injectors/provide_reviews.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage injectors\n\nimport (\n\t\"github.com/cloudwego/biz-demo/bookinfo/kitex_gen/cwg/bookinfo/reviews/reviewsservice\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/constants\"\n\t\"github.com/cloudwego/biz-demo/bookinfo/pkg/metadata\"\n\tkclient \"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/xds\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\txdsmanager \"github.com/kitex-contrib/xds\"\n\t\"github.com/kitex-contrib/xds/core/manager\"\n\t\"github.com/kitex-contrib/xds/xdssuite\"\n)\n\n// ReviewClientOptions client options\ntype ReviewClientOptions struct {\n\tEndpoint  string `mapstructure:\"endpoint\"`\n\tEnableXDS bool   `mapstructure:\"enableXDS\"`\n\tXDSAddr   string `mapstructure:\"xdsAddr\"`\n\tXDSAuth   bool   `mapstructure:\"xdsAuth\"`\n}\n\n// DefaultReviewClientOptions default options\nfunc DefaultReviewClientOptions() *ReviewClientOptions {\n\treturn &ReviewClientOptions{\n\t\tEndpoint:  \"reviews:8082\",\n\t\tEnableXDS: false,\n\t\tXDSAddr:   \"istiod.istio-system.svc:15012\",\n\t\tXDSAuth:   true,\n\t}\n}\n\n// ProvideReviewClient Provide review client\n// 1、init xds manager: only init once\n// 2、enable xds\n// 3、enable opentelemetry\nfunc ProvideReviewClient(opts *ReviewClientOptions) (reviewsservice.Client, error) {\n\tif opts.EnableXDS {\n\t\tif err := xdsmanager.Init(\n\t\t\txdsmanager.WithXDSServerConfig(&manager.XDSServerConfig{\n\t\t\t\tSvrName: constants.IstiodSvrName,\n\t\t\t\tSvrAddr: opts.XDSAddr,\n\t\t\t\tXDSAuth: opts.XDSAuth,\n\t\t\t}),\n\t\t); err != nil {\n\t\t\tklog.Fatal(err)\n\t\t}\n\t\treturn reviewsservice.NewClient(\n\t\t\topts.Endpoint, // use svc fqdn\n\t\t\tkclient.WithSuite(tracing.NewClientSuite()),\n\t\t\tkclient.WithXDSSuite(xds.ClientSuite{\n\t\t\t\tRouterMiddleware: xdssuite.NewXDSRouterMiddleware(\n\t\t\t\t\txdssuite.WithRouterMetaExtractor(metadata.ExtractFromPropagator),\n\t\t\t\t),\n\t\t\t\tResolver: xdssuite.NewXDSResolver(),\n\t\t\t}),\n\t\t)\n\t}\n\n\treturn reviewsservice.NewClient(\n\t\tconstants.ReviewsServiceName,\n\t\tkclient.WithHostPorts(opts.Endpoint),\n\t\tkclient.WithSuite(tracing.NewClientSuite()),\n\t)\n}\n"
  },
  {
    "path": "bookinfo/pkg/metadata/propagator.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage metadata\n\nimport (\n\t\"context\"\n\n\t\"github.com/bytedance/gopkg/cloud/metainfo\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/propagation\"\n)\n\nvar _ propagation.TextMapCarrier = &metadataProvider{}\n\ntype metadataProvider struct {\n\tmetadata map[string]string\n}\n\n// Get a value from metadata by key\nfunc (m *metadataProvider) Get(key string) string {\n\tif v, ok := m.metadata[key]; ok {\n\t\treturn v\n\t}\n\treturn \"\"\n}\n\n// Set a value to metadata by k/v\nfunc (m *metadataProvider) Set(key, value string) {\n\tm.metadata[key] = value\n}\n\n// Keys Iteratively get all keys of metadata\nfunc (m *metadataProvider) Keys() []string {\n\tout := make([]string, 0, len(m.metadata))\n\tfor k := range m.metadata {\n\t\tout = append(out, k)\n\t}\n\treturn out\n}\n\n// ExtractFromPropagator get metadata from propagator\nfunc ExtractFromPropagator(ctx context.Context) map[string]string {\n\tmetadata := metainfo.GetAllValues(ctx)\n\tif metadata == nil {\n\t\tmetadata = make(map[string]string)\n\t}\n\totel.GetTextMapPropagator().Inject(ctx, &metadataProvider{metadata: metadata})\n\treturn metadata\n}\n"
  },
  {
    "path": "bookinfo/pkg/utils/logutils/level.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage logutils\n\nimport (\n\t\"strings\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype Level string\n\nconst (\n\tLevelTrace  Level = \"trace\"\n\tLevelDebug  Level = \"debug\"\n\tLevelInfo   Level = \"info\"\n\tLevelNotice Level = \"notice\"\n\tLevelWarn   Level = \"warn\"\n\tLevelError  Level = \"error\"\n\tLevelFatal  Level = \"fatal\"\n)\n\n// KitexLogLevel return kitex log level\nfunc (level Level) KitexLogLevel() klog.Level {\n\tl := Level(strings.ToLower(string(level)))\n\tswitch l {\n\tcase LevelTrace:\n\t\treturn klog.LevelTrace\n\tcase LevelDebug:\n\t\treturn klog.LevelDebug\n\tcase LevelInfo:\n\t\treturn klog.LevelInfo\n\tcase LevelNotice:\n\t\treturn klog.LevelNotice\n\tcase LevelWarn:\n\t\treturn klog.LevelWarn\n\tcase LevelError:\n\t\treturn klog.LevelError\n\tcase LevelFatal:\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelTrace\n\t}\n}\n"
  },
  {
    "path": "bookinfo/pkg/version/var.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage version\n\nvar module = \"bookinfo\"\n\n// these variables should be set at compile time\nvar (\n\tversion      = \"v0.0.0-master+$Format:%h$\"\n\tbranch       = \"\"\n\tgitCommit    = \"$Format:%H$\"          // sha1 from git, output of $(git rev-parse HEAD)\n\tgitTreeState = \"\"                     // state of git tree, either \"clean\" or \"dirty\"\n\tbuildDate    = \"1970-01-01T00:00:00Z\" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ')\n)\n"
  },
  {
    "path": "bookinfo/pkg/version/version.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage version\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"runtime\"\n)\n\n// Info contains versioning information.\ntype Info struct {\n\tModule       string `json:\"module\"`\n\tVersion      string `json:\"version\"`\n\tBranch       string `json:\"branch\"`\n\tGitCommit    string `json:\"gitCommit\"`\n\tGitTreeState string `json:\"gitTreeState\"`\n\tBuildDate    string `json:\"buildDate\"`\n\tGoVersion    string `json:\"goVersion\"`\n\tCompiler     string `json:\"compiler\"`\n\tPlatform     string `json:\"platform\"`\n}\n\n// Pretty returns a pretty output representation of Info\nfunc (info Info) Pretty() string {\n\tstr, _ := json.MarshalIndent(info, \"\", \"    \")\n\treturn string(str)\n}\n\n// String returns the marshalled json string of Info\nfunc (info Info) String() string {\n\tstr, _ := json.Marshal(info)\n\treturn string(str)\n}\n\n// Get returns the overall codebase version. It's for detecting\n// what code a binary was built from.\nfunc Get() Info {\n\t// These variables typically come from -ldflags settings and in\n\t// their absence fallback to the settings in version/var.go\n\treturn Info{\n\t\tModule:       module,\n\t\tVersion:      version,\n\t\tBranch:       branch,\n\t\tGitCommit:    gitCommit,\n\t\tGitTreeState: gitTreeState,\n\t\tBuildDate:    buildDate,\n\t\tGoVersion:    runtime.Version(),\n\t\tCompiler:     runtime.Compiler,\n\t\tPlatform:     fmt.Sprintf(\"%s/%s\", runtime.GOOS, runtime.GOARCH),\n\t}\n}\n"
  },
  {
    "path": "check_branch_name.sh",
    "content": "#!/usr/bin/env bash\n\ncurrent=$(git status | head -n1 | sed 's/On branch //')\nname=${1:-$current}\nif [[ ! $name =~ ^(((opt(imize)?|feat(ure)?|(bug|hot)?fix|test|refact(or)?|ci)/.+)|(main|develop)|(release-v[0-9]+\\.[0-9]+)|(release/v[0-9]+\\.[0-9]+\\.[0-9]+(-[a-z0-9.]+(\\+[a-z0-9.]+)?)?)|revert-[a-z0-9]+)$ ]]; then\n    echo \"branch name '$name' is invalid\"\n    exit 1\nelse\n    echo \"branch name '$name' is valid\"\nfi\n"
  },
  {
    "path": "easy_note/Makefile",
    "content": "kitex_gen_user:\n\tkitex --thrift-plugin validator -module github.com/cloudwego/biz-demo/easy_note idl/user.thrift # execute in the project root directory\n\nkitex_gen_note:\n\tkitex --thrift-plugin validator -module github.com/cloudwego/biz-demo/easy_note idl/note.thrift # execute in the project root directory\n\ninstall_hz_latest:\n\tgo install github.com/cloudwego/hertz/cmd/hz@latest\n\n\nhertz_gen_model:\n\thz model --idl=idl/api.thrift --mod=github.com/cloudwego/biz-demo/easy_note --model_dir=hertz_gen\n\nhertz_gen_client:\n\thz client --idl=idl/api.thrift --base_domain=http://127.0.0.1:8080 --client_dir=api_request --mod=github.com/cloudwego/biz-demo/easy_note --model_dir=hertz_gen"
  },
  {
    "path": "easy_note/README.md",
    "content": "# Easy Note\n\n## Introduction\n\nA simple note service built with `Kitex` and `Hertz` which is divided into three microservices.\n\n| Service Name | Usage                | Framework   | protocol | Path     | IDL             |\n|--------------|----------------------|-------------|----------|----------|-----------------|\n| demoapi      | HTTP interface       | kitex/hertz | http     | cmd/api  | idl/api.thrift  |\n| demouser     | user data management | kitex/gorm  | thrift   | cmd/user | idl/user.thrift |\n| demonote     | note data management | kitex/gorm  | thrift   | cmd/note | idl/note.thrift |\n\n### Call Relations\n\n![easy-note-arch](./images/easy-note-arch.png)\n\n### Basic Features\n\n- Hertz\n  - Use `thrift` IDL to define HTTP interface\n  - Use `hz` to generate server/client code\n  - Use `Hertz` binding and validate\n  - Use `obs-opentelemetry` and `jarger` for `tracing`, `metrics`, `logging`\n  - Middleware\n    - Use `requestid`, `jwt`, `recovery`, `pprof`, `gzip`\n- Kitex\n  - Use `thrift` IDL to define `RPC` interface\n  - Use `kitex` to generate code\n  - Use `thrift-gen-validator` for validating RPC request\n  - Use `obs-opentelemetry` and `jarger` for `tracing`, `metrics`, `logging`\n  - Use `registry-etcd` for service discovery and register\n\n### Catalog Introduce\n\n| catalog       | introduce               |\n|---------------|-------------------------|\n| hertz_handler | HTTP handler            |\n| service       | business logic          |\n| rpc           | RPC call logic          |\n| dal           | DB operation            |\n| pack          | data pack               |\n| pkg/mw        | RPC middleware          |\n| pkg/consts    | constants               |\n| pkg/errno     | customized error number |\n| pkg/configs   | SQL and Tracing configs |\n\n## Code Generation\n\n| catalog           | command                              |\n|-------------------|--------------------------------------|\n| hertz_api_model   | make hertz_gen_model                 |\n| hertz_api_client  | make hertz_gen_client                |\n| kitex_user_client | make kitex_gen_user                  |\n| kitex_note_client | make kitex_gen_note                  |\n| hertz_api_new     | cd cmd/api && make hertz_new_api     |\n| hertz_api_update  | cd cmd/api && make hertz_update_api  |\n| kitex_user_server | cd cmd/user && make kitex_gen_server |\n| kitex_note_server | cd cmd/note && make kitex_gen_server |\n\n## Quick Start\n\n### Setup Basic Dependence\n\n```shell\ndocker-compose up\n```\n\n### Run User RPC Server\n\n```shell\ncd cmd/user\nsh build.sh\nsh output/bootstrap.sh\n```\n\n### Run Note RPC Server\n\n```shell\ncd cmd/note\nsh build.sh\nsh output/bootstrap.sh\n```\n\n### Run API Server\n\n```shell\ncd cmd/api\nsh build.sh\nsh output/bootstrap.sh\n```\n\n### Jaeger\n\nVisit `http://127.0.0.1:16686/` on browser\n\n#### Snapshots\n\n![jaeger-tracing](./images/jarger-tracing.png)\n\n![jaeger-architecture](./images/jaeger-architecture.png)\n\n### Grafana\n\nVisit `http://127.0.0.1:3000/` on browser\n\n#### Dashboard Example\n\n![grafana-dashboard-example](./images/grafana-dashboard-example.png)\n\n## API Requests\n\n[API Requests](api.md)\n\n### Register\n\n```shell\ncd api_request\ngo run main.go -action register\n```\n\n### Login\n\n```shell\ncd api_request\ngo run main.go -action login\n```\n\n### Create Note\n\n```shell\ncd api_request\ngo run main.go -action createNote\n```\n\n### Query Note\n\n```shell\ncd api_request\ngo run main.go -action queryNote\n```\n\n### Update Note\n\n```shell\ncd api_request\ngo run main.go -action updateNote\n```\n\n### Delete Note\n\n```shell\ncd api_request\ngo run main.go -action deleteNote\n```\n"
  },
  {
    "path": "easy_note/api.md",
    "content": "# API Requests\n\nThe following is a list of API requests and partial responses.\n\n## Register\n\n### request\n\n```shell\ncurl --location --request POST '127.0.0.1:8080/v1/user/register' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    \"username\":\"lorain\",\n    \"password\":\"123456\"\n}'\n```\n\n### response\n\n```javascript\n// successful\n{\n    \"code\": 0,\n    \"message\": \"Success\",\n    \"data\": null\n}\n\n// failed\n{\n    \"code\": 10003,\n    \"message\": \"User already exists\",\n    \"data\": null\n}\n```\n\n## Login\n\n### request\n\n```shell\ncurl --location --request POST '127.0.0.1:8080/v1/user/login' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    \"username\":\"lorain\",\n    \"password\":\"123456\"\n}'\n```\n\n### response\n\n```javascript\n// successful\n{\n    \"code\": 0,\n    \"expire\": \"2022-12-3T01:56:46+08:00\",\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDI1Mjg2MDYsImlkIjoxLCJvcmlnX2lhdCI6MTY0MjUyNTAwNn0.k7Ah9G4Enap9YiDP_rKr5HSzF-fc3cIxwMZAGeOySqU\"\n}\n\n// failed\n{\n    \"code\": 10004,\n    \"message\": \"Authorization failed\",\n    \"data\": null\n}\n```\n\n## Create Note\n\n### request\n\n```shell\ncurl --location --request POST '127.0.0.1:8080/v1/note' \\\n--header 'Authorization: Bearer $token' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    \"title\":\"test title\",\n    \"content\":\"test content\"\n}'\n```\n\n### response\n\n```javascript\n// successful\n{\n    \"code\": 0,\n    \"message\": \"Success\",\n    \"data\": null\n}\n\n// failed\n{\n    \"code\": 10002,\n    \"message\": \"Wrong Parameter has been given\",\n    \"data\": null\n}\n```\n\n## Query Note\n\n### request\n\n```shell\ncurl --location --request GET '127.0.0.1:8080/v1/note/query?offset=0&limit=20&search_key=test' \\\n--header 'Authorization: Bearer $token'\n```\n\n### response\n\n```javascript\n// successful\n{\n    \"code\": 0,\n    \"message\": \"Success\",\n    \"data\": {\n        \"notes\": [\n            {\n                \"note_id\": 1,\n                \"user_id\": 1,\n                \"username\": \"lorain\",\n                \"user_avatar\": \"test\",\n                \"title\": \"test title\",\n                \"content\": \"test content\",\n                \"create_time\": 1642525063\n            }\n        ],\n        \"total\": 1\n    }\n}\n\n// failed\n{\n    \"code\":10002,\n    \"message\":\"Wrong Parameter has been given\",\n    \"data\":null\n}\n```\n\n## Update Note\n\n### request\n\n```shell\ncurl --location --request PUT '127.0.0.1:8080/v1/note/$note_id' \\\n--header 'Authorization: Bearer $token' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    \"title\":\"test\",\n    \"content\":\"test\"\n}'\n```\n\n### response\n\n```javascript\n// successful\n{\n    \"code\": 0,\n    \"message\": \"Success\",\n    \"data\": null\n}\n\n// failed\n{\n    \"code\":10001,\n    \"message\":\"strconv.ParseInt: parsing \\\"$note_id\\\": invalid syntax\",\n    \"data\":null\n}\n```\n\n## Delete Note\n\n### request\n\n```shell\ncurl --location --request DELETE '127.0.0.1:8080/v1/note/$note_id' \\\n--header 'Authorization: Bearer $token'\n```\n\n### response\n\n```javascript\n// successful\n{\n    \"code\": 0,\n    \"message\": \"Success\",\n    \"data\": null\n}\n\n// failed\n{\n    \"code\":10001,\n    \"message\":\"strconv.ParseInt: parsing \\\"$note_id\\\": invalid syntax\",\n    \"data\":null\n}\n```\n"
  },
  {
    "path": "easy_note/api_request/api_service/api_service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hertz generator.\n\npackage api_service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tdemoapi \"github.com/cloudwego/biz-demo/easy_note/hertz_gen/demoapi\"\n\t\"github.com/cloudwego/hertz/pkg/common/config\"\n\t\"github.com/cloudwego/hertz/pkg/protocol\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n)\n\ntype Client interface {\n\tCreateUser(context context.Context, req *demoapi.CreateUserRequest, reqOpt ...config.RequestOption) (resp *demoapi.CreateUserResponse, rawResponse *protocol.Response, err error)\n\n\tCheckUser(context context.Context, req *demoapi.CheckUserRequest, reqOpt ...config.RequestOption) (resp *demoapi.CheckUserResponse, rawResponse *protocol.Response, err error)\n\n\tCreateNote(context context.Context, req *demoapi.CreateNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.CreateNoteResponse, rawResponse *protocol.Response, err error)\n\n\tQueryNote(context context.Context, req *demoapi.QueryNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.QueryNoteResponse, rawResponse *protocol.Response, err error)\n\n\tUpdateNote(context context.Context, req *demoapi.UpdateNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.UpdateNoteResponse, rawResponse *protocol.Response, err error)\n\n\tDeleteNote(context context.Context, req *demoapi.DeleteNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.DeleteNoteResponse, rawResponse *protocol.Response, err error)\n}\n\ntype ApiServiceClient struct {\n\tclient *cli\n}\n\nfunc NewApiServiceClient(hostUrl string, ops ...Option) (Client, error) {\n\topts := getOptions(append(ops, withHostUrl(hostUrl))...)\n\tcli, err := newClient(opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &ApiServiceClient{\n\t\tclient: cli,\n\t}, nil\n}\n\nfunc (s *ApiServiceClient) CreateUser(context context.Context, req *demoapi.CreateUserRequest, reqOpt ...config.RequestOption) (resp *demoapi.CreateUserResponse, rawResponse *protocol.Response, err error) {\n\thttpResp := &demoapi.CreateUserResponse{}\n\tret, err := s.client.r().\n\t\tsetContext(context).\n\t\tsetQueryParams(map[string]interface{}{}).\n\t\tsetPathParams(map[string]string{}).\n\t\tsetHeaders(map[string]string{}).\n\t\tsetFormParams(map[string]string{\n\t\t\t\"username\": req.GetUsername(),\n\t\t\t\"password\": req.GetPassword(),\n\t\t}).\n\t\tsetFormFileParams(map[string]string{}).\n\t\tsetRequestOption(reqOpt...).\n\t\tsetResult(httpResp).\n\t\texecute(\"POST\", \"/v1/user/register\")\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tresp = httpResp\n\trawResponse = ret.rawResponse\n\treturn resp, rawResponse, nil\n}\n\nfunc (s *ApiServiceClient) CheckUser(context context.Context, req *demoapi.CheckUserRequest, reqOpt ...config.RequestOption) (resp *demoapi.CheckUserResponse, rawResponse *protocol.Response, err error) {\n\thttpResp := &demoapi.CheckUserResponse{}\n\tret, err := s.client.r().\n\t\tsetContext(context).\n\t\tsetQueryParams(map[string]interface{}{}).\n\t\tsetPathParams(map[string]string{}).\n\t\tsetHeaders(map[string]string{}).\n\t\tsetFormParams(map[string]string{\n\t\t\t\"username\": req.GetUsername(),\n\t\t\t\"password\": req.GetPassword(),\n\t\t}).\n\t\tsetFormFileParams(map[string]string{}).\n\t\tsetRequestOption(reqOpt...).\n\t\tsetResult(httpResp).\n\t\texecute(\"POST\", \"/v1/user/login\")\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tresp = httpResp\n\trawResponse = ret.rawResponse\n\treturn resp, rawResponse, nil\n}\n\nfunc (s *ApiServiceClient) CreateNote(context context.Context, req *demoapi.CreateNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.CreateNoteResponse, rawResponse *protocol.Response, err error) {\n\thttpResp := &demoapi.CreateNoteResponse{}\n\tret, err := s.client.r().\n\t\tsetContext(context).\n\t\tsetQueryParams(map[string]interface{}{}).\n\t\tsetPathParams(map[string]string{}).\n\t\tsetHeaders(map[string]string{}).\n\t\tsetFormParams(map[string]string{}).\n\t\tsetFormFileParams(map[string]string{}).\n\t\tsetBodyParam(req).\n\t\tsetRequestOption(reqOpt...).\n\t\tsetResult(httpResp).\n\t\texecute(\"POST\", \"/v1/note\")\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tresp = httpResp\n\trawResponse = ret.rawResponse\n\treturn resp, rawResponse, nil\n}\n\nfunc (s *ApiServiceClient) QueryNote(context context.Context, req *demoapi.QueryNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.QueryNoteResponse, rawResponse *protocol.Response, err error) {\n\thttpResp := &demoapi.QueryNoteResponse{}\n\tret, err := s.client.r().\n\t\tsetContext(context).\n\t\tsetQueryParams(map[string]interface{}{\n\t\t\t\"UserID\":     req.GetUserID(),\n\t\t\t\"search_key\": req.GetSearchKey(),\n\t\t\t\"offset\":     req.GetOffset(),\n\t\t\t\"limit\":      req.GetLimit(),\n\t\t}).\n\t\tsetPathParams(map[string]string{}).\n\t\tsetHeaders(map[string]string{}).\n\t\tsetFormParams(map[string]string{}).\n\t\tsetFormFileParams(map[string]string{}).\n\t\tsetBodyParam(req).\n\t\tsetRequestOption(reqOpt...).\n\t\tsetResult(httpResp).\n\t\texecute(\"GET\", \"/v1/note/query\")\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tresp = httpResp\n\trawResponse = ret.rawResponse\n\treturn resp, rawResponse, nil\n}\n\nfunc (s *ApiServiceClient) UpdateNote(context context.Context, req *demoapi.UpdateNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.UpdateNoteResponse, rawResponse *protocol.Response, err error) {\n\thttpResp := &demoapi.UpdateNoteResponse{}\n\tret, err := s.client.r().\n\t\tsetContext(context).\n\t\tsetQueryParams(map[string]interface{}{}).\n\t\tsetPathParams(map[string]string{\n\t\t\t\"note_id\": fmt.Sprint(req.GetNoteID()),\n\t\t}).\n\t\tsetHeaders(map[string]string{}).\n\t\tsetFormParams(map[string]string{\n\t\t\t\"title\":   req.GetTitle(),\n\t\t\t\"content\": req.GetContent(),\n\t\t}).\n\t\tsetFormFileParams(map[string]string{}).\n\t\tsetRequestOption(reqOpt...).\n\t\tsetResult(httpResp).\n\t\texecute(\"PUT\", \"/v1/note/:note_id\")\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tresp = httpResp\n\trawResponse = ret.rawResponse\n\treturn resp, rawResponse, nil\n}\n\nfunc (s *ApiServiceClient) DeleteNote(context context.Context, req *demoapi.DeleteNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.DeleteNoteResponse, rawResponse *protocol.Response, err error) {\n\thttpResp := &demoapi.DeleteNoteResponse{}\n\tret, err := s.client.r().\n\t\tsetContext(context).\n\t\tsetQueryParams(map[string]interface{}{}).\n\t\tsetPathParams(map[string]string{\n\t\t\t\"note_id\": fmt.Sprint(req.GetNoteID()),\n\t\t}).\n\t\tsetHeaders(map[string]string{}).\n\t\tsetFormParams(map[string]string{}).\n\t\tsetFormFileParams(map[string]string{}).\n\t\tsetBodyParam(req).\n\t\tsetRequestOption(reqOpt...).\n\t\tsetResult(httpResp).\n\t\texecute(\"DELETE\", \"/v1/note/:note_id\")\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tresp = httpResp\n\trawResponse = ret.rawResponse\n\treturn resp, rawResponse, nil\n}\n\nvar defaultClient, _ = NewApiServiceClient(\"http://127.0.0.1:8080\")\n\nfunc ConfigDefaultClient(ops ...Option) (err error) {\n\tdefaultClient, err = NewApiServiceClient(\"http://127.0.0.1:8080\", ops...)\n\treturn\n}\n\nfunc CreateUser(context context.Context, req *demoapi.CreateUserRequest, reqOpt ...config.RequestOption) (resp *demoapi.CreateUserResponse, rawResponse *protocol.Response, err error) {\n\treturn defaultClient.CreateUser(context, req, reqOpt...)\n}\n\nfunc CheckUser(context context.Context, req *demoapi.CheckUserRequest, reqOpt ...config.RequestOption) (resp *demoapi.CheckUserResponse, rawResponse *protocol.Response, err error) {\n\treturn defaultClient.CheckUser(context, req, reqOpt...)\n}\n\nfunc CreateNote(context context.Context, req *demoapi.CreateNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.CreateNoteResponse, rawResponse *protocol.Response, err error) {\n\treturn defaultClient.CreateNote(context, req, reqOpt...)\n}\n\nfunc QueryNote(context context.Context, req *demoapi.QueryNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.QueryNoteResponse, rawResponse *protocol.Response, err error) {\n\treturn defaultClient.QueryNote(context, req, reqOpt...)\n}\n\nfunc UpdateNote(context context.Context, req *demoapi.UpdateNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.UpdateNoteResponse, rawResponse *protocol.Response, err error) {\n\treturn defaultClient.UpdateNote(context, req, reqOpt...)\n}\n\nfunc DeleteNote(context context.Context, req *demoapi.DeleteNoteRequest, reqOpt ...config.RequestOption) (resp *demoapi.DeleteNoteResponse, rawResponse *protocol.Response, err error) {\n\treturn defaultClient.DeleteNote(context, req, reqOpt...)\n}\n"
  },
  {
    "path": "easy_note/api_request/api_service/hertz_client.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hz.\n\npackage api_service\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strings\"\n\n\thertz_client \"github.com/cloudwego/hertz/pkg/app/client\"\n\t\"github.com/cloudwego/hertz/pkg/common/config\"\n\t\"github.com/cloudwego/hertz/pkg/common/errors\"\n\t\"github.com/cloudwego/hertz/pkg/protocol\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/client\"\n)\n\ntype use interface {\n\tUse(mws ...hertz_client.Middleware)\n}\n\n// Definition of global data and types.\ntype ResponseResultDecider func(statusCode int, rawResponse *protocol.Response) (isError bool)\n\ntype (\n\tbindRequestBodyFunc func(c *cli, r *request) (contentType string, body io.Reader, err error)\n\tbeforeRequestFunc   func(*cli, *request) error\n\tafterResponseFunc   func(*cli, *response) error\n)\n\nvar (\n\thdrContentTypeKey     = http.CanonicalHeaderKey(\"Content-Type\")\n\thdrContentEncodingKey = http.CanonicalHeaderKey(\"Content-Encoding\")\n\n\tplainTextType   = \"text/plain; charset=utf-8\"\n\tjsonContentType = \"application/json; charset=utf-8\"\n\tformContentType = \"multipart/form-data\"\n\n\tjsonCheck = regexp.MustCompile(`(?i:(application|text)/(json|.*\\+json|json\\-.*)(; |$))`)\n\txmlCheck  = regexp.MustCompile(`(?i:(application|text)/(xml|.*\\+xml)(; |$))`)\n)\n\n// Configuration of client\ntype Option struct {\n\tf func(*Options)\n}\n\ntype Options struct {\n\thostUrl               string\n\tdoer                  client.Doer\n\theader                http.Header\n\trequestBodyBind       bindRequestBodyFunc\n\tresponseResultDecider ResponseResultDecider\n\tmiddlewares           []hertz_client.Middleware\n\tclientOption          []config.ClientOption\n}\n\nfunc getOptions(ops ...Option) *Options {\n\topts := &Options{}\n\tfor _, do := range ops {\n\t\tdo.f(opts)\n\t}\n\treturn opts\n}\n\n// WithHertzClientOption is used to pass configuration for the hertz client\nfunc WithHertzClientOption(opt ...config.ClientOption) Option {\n\treturn Option{func(op *Options) {\n\t\top.clientOption = append(op.clientOption, opt...)\n\t}}\n}\n\n// WithHertzClientMiddleware is used to register the middleware for the hertz client\nfunc WithHertzClientMiddleware(mws ...hertz_client.Middleware) Option {\n\treturn Option{func(op *Options) {\n\t\top.middlewares = append(op.middlewares, mws...)\n\t}}\n}\n\n// WithHertzClient is used to register a custom hertz client\nfunc WithHertzClient(client client.Doer) Option {\n\treturn Option{func(op *Options) {\n\t\top.doer = client\n\t}}\n}\n\n// WithHeader is used to add the default header, which is carried by every request\nfunc WithHeader(header http.Header) Option {\n\treturn Option{func(op *Options) {\n\t\top.header = header\n\t}}\n}\n\n// WithResponseResultDecider configure custom deserialization of http response to response struct\nfunc WithResponseResultDecider(decider ResponseResultDecider) Option {\n\treturn Option{func(op *Options) {\n\t\top.responseResultDecider = decider\n\t}}\n}\n\nfunc withHostUrl(HostUrl string) Option {\n\treturn Option{func(op *Options) {\n\t\top.hostUrl = HostUrl\n\t}}\n}\n\n// underlying client\ntype cli struct {\n\thostUrl               string\n\tdoer                  client.Doer\n\theader                http.Header\n\tbindRequestBody       bindRequestBodyFunc\n\tresponseResultDecider ResponseResultDecider\n\n\tbeforeRequest []beforeRequestFunc\n\tafterResponse []afterResponseFunc\n}\n\nfunc (c *cli) Use(mws ...hertz_client.Middleware) error {\n\tu, ok := c.doer.(use)\n\tif !ok {\n\t\treturn errors.NewPublic(\"doer does not support middleware, choose the right doer.\")\n\t}\n\tu.Use(mws...)\n\treturn nil\n}\n\nfunc newClient(opts *Options) (*cli, error) {\n\tif opts.requestBodyBind == nil {\n\t\topts.requestBodyBind = defaultRequestBodyBind\n\t}\n\tif opts.responseResultDecider == nil {\n\t\topts.responseResultDecider = defaultResponseResultDecider\n\t}\n\tif opts.doer == nil {\n\t\tcli, err := hertz_client.NewClient(opts.clientOption...)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\topts.doer = cli\n\t}\n\n\tc := &cli{\n\t\thostUrl:               opts.hostUrl,\n\t\tdoer:                  opts.doer,\n\t\theader:                opts.header,\n\t\tbindRequestBody:       opts.requestBodyBind,\n\t\tresponseResultDecider: opts.responseResultDecider,\n\t\tbeforeRequest: []beforeRequestFunc{\n\t\t\tparseRequestURL,\n\t\t\tparseRequestHeader,\n\t\t\tcreateHTTPRequest,\n\t\t},\n\t\tafterResponse: []afterResponseFunc{\n\t\t\tparseResponseBody,\n\t\t},\n\t}\n\n\tif len(opts.middlewares) != 0 {\n\t\tif err := c.Use(opts.middlewares...); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn c, nil\n}\n\nfunc (c *cli) execute(req *request) (*response, error) {\n\tvar err error\n\tfor _, f := range c.beforeRequest {\n\t\tif err = f(c, req); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif hostHeader := req.header.Get(\"Host\"); hostHeader != \"\" {\n\t\treq.rawRequest.Header.SetHost(hostHeader)\n\t}\n\n\tresp := protocol.Response{}\n\n\terr = c.doer.Do(req.ctx, req.rawRequest, &resp)\n\n\tresponse := &response{\n\t\trequest:     req,\n\t\trawResponse: &resp,\n\t}\n\n\tif err != nil {\n\t\treturn response, err\n\t}\n\n\tbody, err := resp.BodyE()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif strings.EqualFold(resp.Header.Get(hdrContentEncodingKey), \"gzip\") && resp.Header.ContentLength() != 0 {\n\t\tbody, err = resp.BodyGunzip()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tresponse.bodyByte = body\n\n\tresponse.size = int64(len(response.bodyByte))\n\n\t// Apply Response middleware\n\tfor _, f := range c.afterResponse {\n\t\tif err = f(c, response); err != nil {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn response, err\n}\n\n// r get request\nfunc (c *cli) r() *request {\n\treturn &request{\n\t\tqueryParam: url.Values{},\n\t\theader:     http.Header{},\n\t\tpathParam:  map[string]string{},\n\t\tformParam:  map[string]string{},\n\t\tfileParam:  map[string]string{},\n\t\tclient:     c,\n\t}\n}\n\ntype response struct {\n\trequest     *request\n\trawResponse *protocol.Response\n\n\tbodyByte []byte\n\tsize     int64\n}\n\n// statusCode method returns the HTTP status code for the executed request.\nfunc (r *response) statusCode() int {\n\tif r.rawResponse == nil {\n\t\treturn 0\n\t}\n\n\treturn r.rawResponse.StatusCode()\n}\n\n// body method returns HTTP response as []byte array for the executed request.\nfunc (r *response) body() []byte {\n\tif r.rawResponse == nil {\n\t\treturn []byte{}\n\t}\n\treturn r.bodyByte\n}\n\n// Header method returns the response headers\nfunc (r *response) header() http.Header {\n\tif r.rawResponse == nil {\n\t\treturn http.Header{}\n\t}\n\th := http.Header{}\n\tr.rawResponse.Header.VisitAll(func(key, value []byte) {\n\t\th.Add(string(key), string(value))\n\t})\n\n\treturn h\n}\n\ntype request struct {\n\tclient         *cli\n\turl            string\n\tmethod         string\n\tqueryParam     url.Values\n\theader         http.Header\n\tpathParam      map[string]string\n\tformParam      map[string]string\n\tfileParam      map[string]string\n\tbodyParam      interface{}\n\trawRequest     *protocol.Request\n\tctx            context.Context\n\trequestOptions []config.RequestOption\n\tresult         interface{}\n\tError          interface{}\n}\n\nfunc (r *request) setContext(ctx context.Context) *request {\n\tr.ctx = ctx\n\treturn r\n}\n\nfunc (r *request) context() context.Context {\n\treturn r.ctx\n}\n\nfunc (r *request) setHeader(header, value string) *request {\n\tr.header.Set(header, value)\n\treturn r\n}\n\nfunc (r *request) setQueryParam(param string, value interface{}) *request {\n\tv := reflect.ValueOf(value)\n\tswitch v.Kind() {\n\tcase reflect.Slice, reflect.Array:\n\t\tfor index := 0; index < v.Len(); index++ {\n\t\t\tr.queryParam.Add(param, fmt.Sprint(v.Index(index).Interface()))\n\t\t}\n\tdefault:\n\t\tr.queryParam.Set(param, fmt.Sprint(v))\n\t}\n\treturn r\n}\n\nfunc (r *request) setResult(res interface{}) *request {\n\tr.result = res\n\treturn r\n}\n\nfunc (r *request) setError(err interface{}) *request {\n\tr.Error = err\n\treturn r\n}\n\nfunc (r *request) setHeaders(headers map[string]string) *request {\n\tfor h, v := range headers {\n\t\tr.setHeader(h, v)\n\t}\n\n\treturn r\n}\n\nfunc (r *request) setQueryParams(params map[string]interface{}) *request {\n\tfor p, v := range params {\n\t\tr.setQueryParam(p, v)\n\t}\n\n\treturn r\n}\n\nfunc (r *request) setPathParams(params map[string]string) *request {\n\tfor p, v := range params {\n\t\tr.pathParam[p] = v\n\t}\n\treturn r\n}\n\nfunc (r *request) setFormParams(params map[string]string) *request {\n\tfor p, v := range params {\n\t\tr.formParam[p] = v\n\t}\n\treturn r\n}\n\nfunc (r *request) setFormFileParams(params map[string]string) *request {\n\tfor p, v := range params {\n\t\tr.fileParam[p] = v\n\t}\n\treturn r\n}\n\nfunc (r *request) setBodyParam(body interface{}) *request {\n\tr.bodyParam = body\n\treturn r\n}\n\nfunc (r *request) setRequestOption(option ...config.RequestOption) *request {\n\tr.requestOptions = append(r.requestOptions, option...)\n\treturn r\n}\n\nfunc (r *request) execute(method, url string) (*response, error) {\n\tr.method = method\n\tr.url = url\n\treturn r.client.execute(r)\n}\n\nfunc parseRequestURL(c *cli, r *request) error {\n\tif len(r.pathParam) > 0 {\n\t\tfor p, v := range r.pathParam {\n\t\t\tr.url = strings.Replace(r.url, \":\"+p, url.PathEscape(v), -1)\n\t\t}\n\t}\n\n\t// Parsing request URL\n\treqURL, err := url.Parse(r.url)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// If request.URL is relative path then added c.HostURL into\n\t// the request URL otherwise request.URL will be used as-is\n\tif !reqURL.IsAbs() {\n\t\tr.url = reqURL.String()\n\t\tif len(r.url) > 0 && r.url[0] != '/' {\n\t\t\tr.url = \"/\" + r.url\n\t\t}\n\n\t\treqURL, err = url.Parse(c.hostUrl + r.url)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Adding Query Param\n\tquery := make(url.Values)\n\n\tfor k, v := range r.queryParam {\n\t\t// remove query param from client level by key\n\t\t// since overrides happens for that key in the request\n\t\tquery.Del(k)\n\t\tfor _, iv := range v {\n\t\t\tquery.Add(k, iv)\n\t\t}\n\t}\n\n\tif len(query) > 0 {\n\t\tif isStringEmpty(reqURL.RawQuery) {\n\t\t\treqURL.RawQuery = query.Encode()\n\t\t} else {\n\t\t\treqURL.RawQuery = reqURL.RawQuery + \"&\" + query.Encode()\n\t\t}\n\t}\n\n\tr.url = reqURL.String()\n\n\treturn nil\n}\n\nfunc isStringEmpty(str string) bool {\n\treturn len(strings.TrimSpace(str)) == 0\n}\n\nfunc parseRequestHeader(c *cli, r *request) error {\n\thdr := make(http.Header)\n\tif c.header != nil {\n\t\tfor k := range c.header {\n\t\t\thdr[k] = append(hdr[k], c.header[k]...)\n\t\t}\n\t}\n\n\tfor k := range r.header {\n\t\thdr.Del(k)\n\t\thdr[k] = append(hdr[k], r.header[k]...)\n\t}\n\n\tif len(r.formParam) != 0 || len(r.fileParam) != 0 {\n\t\thdr.Add(hdrContentTypeKey, formContentType)\n\t}\n\n\tr.header = hdr\n\treturn nil\n}\n\n// detectContentType method is used to figure out \"request.Body\" content type for request header\nfunc detectContentType(body interface{}) string {\n\tcontentType := plainTextType\n\tkind := reflect.Indirect(reflect.ValueOf(body)).Kind()\n\tswitch kind {\n\tcase reflect.Struct, reflect.Map:\n\t\tcontentType = jsonContentType\n\tcase reflect.String:\n\t\tcontentType = plainTextType\n\tdefault:\n\t\tif b, ok := body.([]byte); ok {\n\t\t\tcontentType = http.DetectContentType(b)\n\t\t} else if kind == reflect.Slice {\n\t\t\tcontentType = jsonContentType\n\t\t}\n\t}\n\n\treturn contentType\n}\n\nfunc defaultRequestBodyBind(c *cli, r *request) (contentType string, body io.Reader, err error) {\n\tif !isPayloadSupported(r.method) {\n\t\treturn\n\t}\n\tvar bodyBytes []byte\n\tcontentType = r.header.Get(hdrContentTypeKey)\n\tif isStringEmpty(contentType) {\n\t\tcontentType = detectContentType(r.bodyParam)\n\t\tr.header.Set(hdrContentTypeKey, contentType)\n\t}\n\tkind := reflect.Indirect(reflect.ValueOf(r.bodyParam)).Kind()\n\tif isJSONType(contentType) &&\n\t\t(kind == reflect.Struct || kind == reflect.Map || kind == reflect.Slice) {\n\t\tbodyBytes, err = json.Marshal(r.bodyParam)\n\t} else if isXMLType(contentType) && (kind == reflect.Struct) {\n\t\tbodyBytes, err = xml.Marshal(r.bodyParam)\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn contentType, strings.NewReader(string(bodyBytes)), nil\n}\n\nfunc isPayloadSupported(m string) bool {\n\treturn !(m == http.MethodHead || m == http.MethodOptions || m == http.MethodGet || m == http.MethodDelete)\n}\n\nfunc createHTTPRequest(c *cli, r *request) (err error) {\n\tcontentType, body, err := c.bindRequestBody(c, r)\n\tif !isStringEmpty(contentType) {\n\t\tr.header.Set(hdrContentTypeKey, contentType)\n\t}\n\tif err == nil {\n\t\tr.rawRequest = protocol.NewRequest(r.method, r.url, body)\n\t\tif contentType == formContentType && isPayloadSupported(r.method) {\n\t\t\tif r.rawRequest.IsBodyStream() {\n\t\t\t\tr.rawRequest.ResetBody()\n\t\t\t}\n\t\t\tr.rawRequest.SetMultipartFormData(r.formParam)\n\t\t\tr.rawRequest.SetFiles(r.fileParam)\n\t\t}\n\t\tfor key, values := range r.header {\n\t\t\tfor _, val := range values {\n\t\t\t\tr.rawRequest.Header.Add(key, val)\n\t\t\t}\n\t\t}\n\t\tr.rawRequest.SetOptions(r.requestOptions...)\n\t}\n\treturn err\n}\n\nfunc silently(_ ...interface{}) {}\n\n// defaultResponseResultDecider method returns true if HTTP status code >= 400 otherwise false.\nfunc defaultResponseResultDecider(statusCode int, rawResponse *protocol.Response) bool {\n\treturn statusCode > 399\n}\n\n// IsJSONType method is to check JSON content type or not\nfunc isJSONType(ct string) bool {\n\treturn jsonCheck.MatchString(ct)\n}\n\n// IsXMLType method is to check XML content type or not\nfunc isXMLType(ct string) bool {\n\treturn xmlCheck.MatchString(ct)\n}\n\nfunc parseResponseBody(c *cli, res *response) (err error) {\n\tif res.statusCode() == http.StatusNoContent {\n\t\treturn\n\t}\n\t// Handles only JSON or XML content type\n\tct := res.header().Get(hdrContentTypeKey)\n\n\tisError := c.responseResultDecider(res.statusCode(), res.rawResponse)\n\tif isError {\n\t\tif res.request.Error != nil {\n\t\t\tif isJSONType(ct) || isXMLType(ct) {\n\t\t\t\terr = unmarshalContent(ct, res.bodyByte, res.request.Error)\n\t\t\t}\n\t\t} else {\n\t\t\tjsonByte, jsonErr := json.Marshal(map[string]interface{}{\n\t\t\t\t\"status_code\": res.rawResponse.StatusCode(),\n\t\t\t\t\"body\":        string(res.bodyByte),\n\t\t\t})\n\t\t\tif jsonErr != nil {\n\t\t\t\treturn jsonErr\n\t\t\t}\n\t\t\terr = fmt.Errorf(string(jsonByte))\n\t\t}\n\t} else if res.request.result != nil {\n\t\tif isJSONType(ct) || isXMLType(ct) {\n\t\t\terr = unmarshalContent(ct, res.bodyByte, res.request.result)\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\n// unmarshalContent content into object from JSON or XML\nfunc unmarshalContent(ct string, b []byte, d interface{}) (err error) {\n\tif isJSONType(ct) {\n\t\terr = json.Unmarshal(b, d)\n\t} else if isXMLType(ct) {\n\t\terr = xml.Unmarshal(b, d)\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "easy_note/api_request/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/api_request/api_service\"\n\t\"github.com/cloudwego/biz-demo/easy_note/hertz_gen/demoapi\"\n)\n\nvar action = flag.String(\"action\", \"\", \"执行的操作\")\n\nfunc main() {\n\tflag.Parse()\n\tfmt.Println(*action)\n\tswitch *action {\n\tcase \"register\":\n\t\tCreateUser()\n\tcase \"login\":\n\t\tCheckUser()\n\tcase \"createNote\":\n\t\tCreateNote()\n\tcase \"queryNote\":\n\t\tQueryNote()\n\tcase \"updateNote\":\n\t\tUpdateNote()\n\tcase \"deleteNote\":\n\t\tDeleteNote()\n\tdefault:\n\t\tfmt.Printf(\"wrong action: %s\\n\", *action)\n\t}\n}\n\nfunc CreateUser() {\n\treq := demoapi.CreateUserRequest{\n\t\tUsername: \"lorain\",\n\t\tPassword: \"123456\",\n\t}\n\tresp, rawResp, err := api_service.CreateUser(context.Background(), &req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(resp)\n\tfmt.Println(string(rawResp.Body()))\n}\n\nfunc CheckUser() {\n\treq := demoapi.CheckUserRequest{\n\t\tUsername: \"lorain\",\n\t\tPassword: \"123456\",\n\t}\n\t_, rawResp, err := api_service.CheckUser(context.Background(), &req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tvar res map[string]interface{}\n\terr = json.Unmarshal(rawResp.Body(), &res)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\ttoken = res[\"token\"].(string)\n\tdefaultHeader.Add(\"Authorization\", \"Bearer \"+token)\n\tfmt.Printf(\"token:%s\\n\", token)\n}\n\nvar (\n\tdefaultHeader = http.Header{}\n\ttoken         string\n)\n\nfunc CreateNote() {\n\tCheckUser()\n\tauthorizationClient, _ := api_service.NewApiServiceClient(\"http://127.0.0.1:8080\", api_service.WithHeader(defaultHeader))\n\treq := demoapi.CreateNoteRequest{\n\t\tTitle:   \"test title\",\n\t\tContent: \"test content\",\n\t}\n\tresp, rawResp, err := authorizationClient.CreateNote(context.Background(), &req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(resp)\n\tfmt.Println(string(rawResp.Body()))\n}\n\nfunc QueryNote() {\n\tCheckUser()\n\tauthorizationClient, _ := api_service.NewApiServiceClient(\"http://127.0.0.1:8080\", api_service.WithHeader(defaultHeader))\n\tkey := \"test\"\n\treq := demoapi.QueryNoteRequest{\n\t\tOffset:    0,\n\t\tLimit:     20,\n\t\tSearchKey: &key,\n\t}\n\t_, rawResp, err := authorizationClient.QueryNote(context.Background(), &req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(string(rawResp.Body()))\n}\n\nfunc UpdateNote() {\n\tCheckUser()\n\tauthorizationClient, _ := api_service.NewApiServiceClient(\"http://127.0.0.1:8080\", api_service.WithHeader(defaultHeader))\n\ttitle := \"test\"\n\tcontent := \"test\"\n\treq := demoapi.UpdateNoteRequest{\n\t\tTitle:   &title,\n\t\tContent: &content,\n\t\tNoteID:  1,\n\t}\n\tresp, rawResp, err := authorizationClient.UpdateNote(context.Background(), &req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(resp)\n\tfmt.Println(string(rawResp.Body()))\n}\n\nfunc DeleteNote() {\n\tCheckUser()\n\tauthorizationClient, _ := api_service.NewApiServiceClient(\"http://127.0.0.1:8080\", api_service.WithHeader(defaultHeader))\n\treq := demoapi.DeleteNoteRequest{\n\t\tNoteID: 1,\n\t}\n\t_, rawResp, err := authorizationClient.DeleteNote(context.Background(), &req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(string(rawResp.Body()))\n}\n"
  },
  {
    "path": "easy_note/cmd/api/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\ndumped_hertz_remote_config.json\n\t\t  "
  },
  {
    "path": "easy_note/cmd/api/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.5.2\nhandlerDir: hertz_handler\nmodelDir: \"\"\nrouterDir: hertz_router\n"
  },
  {
    "path": "easy_note/cmd/api/Makefile",
    "content": "install_hz_latest:\n\tgo install github.com/cloudwego/hertz/cmd/hz@latest\n\nhertz_new_api:\n\thz new --idl=../../idl/api.thrift --service=hello.api --router_dir=hertz_router --handler_dir=hertz_handler -f -use=github.com/cloudwego/biz-demo/easy_note/hertz_gen\n\nhertz_update_api:\n\thz update --idl=../../idl/api.thrift -use=github.com/cloudwego/biz-demo/easy_note/hertz_gen\n\nrun:\n\tsh build.sh && sh output/bootstrap.sh"
  },
  {
    "path": "easy_note/cmd/api/build.sh",
    "content": "\n#!/bin/bash\nRUN_NAME=hello.api\nmkdir -p output/bin\ncp script/* output 2>/dev/null\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "easy_note/cmd/api/hertz_handler/demoapi/api_service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hertz generator.\n\npackage demoapi\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/api/mw\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/api/rpc\"\n\tdemoapi \"github.com/cloudwego/biz-demo/easy_note/hertz_gen/demoapi\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\n// CreateUser .\n// @router /v1/user/register [POST]\nfunc CreateUser(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req demoapi.CreateUserRequest\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\terr = rpc.CreateUser(ctx, &demouser.CreateUserRequest{\n\t\tUsername: req.Username,\n\t\tPassword: req.Password,\n\t})\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tSendResponse(c, errno.Success, nil)\n}\n\n// CheckUser .\n// @router /v1/user/login [POST]\nfunc CheckUser(ctx context.Context, c *app.RequestContext) {\n\tmw.JwtMiddleware.LoginHandler(ctx, c)\n}\n\n// CreateNote .\n// @router /v1/note [POST]\nfunc CreateNote(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req demoapi.CreateNoteRequest\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tv, _ := c.Get(consts.IdentityKey)\n\terr = rpc.CreateNote(ctx, &demonote.CreateNoteRequest{\n\t\tTitle:   req.Title,\n\t\tContent: req.Content,\n\t\tUserId:  v.(*demoapi.User).UserID,\n\t})\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tSendResponse(c, errno.Success, nil)\n}\n\n// QueryNote .\n// @router /v1/note/query [GET]\nfunc QueryNote(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req demoapi.QueryNoteRequest\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tv, _ := c.Get(consts.IdentityKey)\n\tnotes, total, err := rpc.QueryNotes(ctx, &demonote.QueryNoteRequest{\n\t\tUserId:    v.(*demoapi.User).UserID,\n\t\tSearchKey: req.SearchKey,\n\t\tOffset:    req.Offset,\n\t\tLimit:     req.Limit,\n\t})\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tSendResponse(c, errno.Success, utils.H{\n\t\tconsts.Total: total,\n\t\tconsts.Notes: notes,\n\t})\n}\n\n// UpdateNote .\n// @router /v1/note/:note_id [PUT]\nfunc UpdateNote(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req demoapi.UpdateNoteRequest\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tv, _ := c.Get(consts.IdentityKey)\n\terr = rpc.UpdateNote(ctx, &demonote.UpdateNoteRequest{\n\t\tNoteId:  req.NoteID,\n\t\tUserId:  v.(*demoapi.User).UserID,\n\t\tTitle:   req.Title,\n\t\tContent: req.Content,\n\t})\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tSendResponse(c, errno.Success, nil)\n}\n\n// DeleteNote .\n// @router /v1/note/:note_id [DELETE]\nfunc DeleteNote(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req demoapi.DeleteNoteRequest\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tv, _ := c.Get(consts.IdentityKey)\n\terr = rpc.DeleteNote(ctx, &demonote.DeleteNoteRequest{\n\t\tNoteId: req.NoteID,\n\t\tUserId: v.(*demoapi.User).UserID,\n\t})\n\tif err != nil {\n\t\tSendResponse(c, errno.ConvertErr(err), nil)\n\t\treturn\n\t}\n\tSendResponse(c, errno.Success, nil)\n}\n"
  },
  {
    "path": "easy_note/cmd/api/hertz_handler/demoapi/handler.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage demoapi\n\nimport (\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\ntype Response struct {\n\tCode    int64       `json:\"code\"`\n\tMessage string      `json:\"message\"`\n\tData    interface{} `json:\"data\"`\n}\n\n// SendResponse pack response\nfunc SendResponse(c *app.RequestContext, err error, data interface{}) {\n\tErr := errno.ConvertErr(err)\n\tc.JSON(consts.StatusOK, Response{\n\t\tCode:    Err.ErrCode,\n\t\tMessage: Err.ErrMsg,\n\t\tData:    data,\n\t})\n}\n"
  },
  {
    "path": "easy_note/cmd/api/hertz_handler/ping.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hertz generator.\n\npackage hertz_handler\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Ping .\nfunc Ping(ctx context.Context, c *app.RequestContext) {\n\tc.JSON(consts.StatusOK, utils.H{\n\t\t\"message\": \"pong\",\n\t})\n}\n"
  },
  {
    "path": "easy_note/cmd/api/hertz_router/demoapi/api.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage demoapi\n\nimport (\n\tdemoapi \"github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_handler/demoapi\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_v1 := root.Group(\"/v1\", _v1Mw()...)\n\t\t_v1.POST(\"/note\", append(_noteMw(), demoapi.CreateNote)...)\n\t\t_note := _v1.Group(\"/note\", _noteMw()...)\n\t\t_note.PUT(\"/:note_id\", append(_updatenoteMw(), demoapi.UpdateNote)...)\n\t\t_note.DELETE(\"/:note_id\", append(_deletenoteMw(), demoapi.DeleteNote)...)\n\t\t_note.GET(\"/query\", append(_querynoteMw(), demoapi.QueryNote)...)\n\t\t{\n\t\t\t_user := _v1.Group(\"/user\", _userMw()...)\n\t\t\t_user.POST(\"/login\", append(_checkuserMw(), demoapi.CheckUser)...)\n\t\t\t_user.POST(\"/register\", append(_createuserMw(), demoapi.CreateUser)...)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "easy_note/cmd/api/hertz_router/demoapi/middleware.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hertz generator.\n\npackage demoapi\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/api/mw\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/requestid\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{\n\t\t// use recovery mw\n\t\trecovery.Recovery(recovery.WithRecoveryHandler(\n\t\t\tfunc(ctx context.Context, c *app.RequestContext, err interface{}, stack []byte) {\n\t\t\t\thlog.SystemLogger().CtxErrorf(ctx, \"[Recovery] err=%v\\nstack=%s\", err, stack)\n\t\t\t\tc.JSON(consts.StatusInternalServerError, utils.H{\n\t\t\t\t\t\"code\":    errno.ServiceErr.ErrCode,\n\t\t\t\t\t\"message\": fmt.Sprintf(\"[Recovery] err=%v\\nstack=%s\", err, stack),\n\t\t\t\t})\n\t\t\t},\n\t\t)),\n\t\t// use requestid mw\n\t\trequestid.New(\n\t\t\trequestid.WithGenerator(func(ctx context.Context, c *app.RequestContext) string {\n\t\t\t\ttraceID := trace.SpanFromContext(ctx).SpanContext().TraceID().String()\n\t\t\t\treturn traceID\n\t\t\t}),\n\t\t),\n\t\t// use gzip mw\n\t\tgzip.Gzip(gzip.DefaultCompression),\n\t}\n}\n\nfunc _v1Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _noteMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{\n\t\t// use jwt mw\n\t\tmw.JwtMiddleware.MiddlewareFunc(),\n\t}\n}\n\nfunc _updatenoteMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _deletenoteMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _querynoteMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _userMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkuserMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _createuserMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "easy_note/cmd/api/hertz_router/register.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage hertz_router\n\nimport (\n\tdemoapi \"github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_router/demoapi\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\tdemoapi.Register(r)\n}\n"
  },
  {
    "path": "easy_note/cmd/api/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/api/mw\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/api/rpc\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\thertzlogrus \"github.com/hertz-contrib/obs-opentelemetry/logging/logrus\"\n\t\"github.com/hertz-contrib/obs-opentelemetry/tracing\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n)\n\nfunc Init() {\n\trpc.Init()\n\tmw.InitJWT()\n\t// hlog init\n\thlog.SetLogger(hertzlogrus.NewLogger())\n\thlog.SetLevel(hlog.LevelInfo)\n}\n\nfunc main() {\n\tp := provider.NewOpenTelemetryProvider(\n\t\tprovider.WithServiceName(consts.ApiServiceName),\n\t\tprovider.WithExportEndpoint(consts.ExportEndpoint),\n\t\tprovider.WithInsecure(),\n\t)\n\tdefer p.Shutdown(context.Background()) // nolint:errcheck\n\n\tInit()\n\ttracer, cfg := tracing.NewServerTracer()\n\th := server.New(\n\t\tserver.WithHostPorts(\":8080\"),\n\t\tserver.WithHandleMethodNotAllowed(true), // coordinate with NoMethod\n\t\ttracer,\n\t)\n\t// use pprof mw\n\tpprof.Register(h)\n\t// use otel mw\n\th.Use(tracing.ServerMiddleware(cfg))\n\tregister(h)\n\th.Spin()\n}\n"
  },
  {
    "path": "easy_note/cmd/api/mw/jwt.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage mw\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/api/rpc\"\n\t\"github.com/cloudwego/biz-demo/easy_note/hertz_gen/demoapi\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\tjwtv4 \"github.com/golang-jwt/jwt/v4\"\n\t\"github.com/hertz-contrib/jwt\"\n)\n\nvar JwtMiddleware *jwt.HertzJWTMiddleware\n\nfunc InitJWT() {\n\tJwtMiddleware, _ = jwt.New(&jwt.HertzJWTMiddleware{\n\t\tKey:           []byte(consts.SecretKey),\n\t\tTokenLookup:   \"header: Authorization, query: token, cookie: jwt\",\n\t\tTokenHeadName: \"Bearer\",\n\t\tTimeFunc:      time.Now,\n\t\tTimeout:       time.Hour,\n\t\tMaxRefresh:    time.Hour,\n\t\tIdentityKey:   consts.IdentityKey,\n\t\tIdentityHandler: func(ctx context.Context, c *app.RequestContext) interface{} {\n\t\t\tclaims := jwt.ExtractClaims(ctx, c)\n\t\t\tuserid, _ := claims[consts.IdentityKey].(json.Number).Int64()\n\t\t\treturn &demoapi.User{\n\t\t\t\tUserID: userid,\n\t\t\t}\n\t\t},\n\t\tPayloadFunc: func(data interface{}) jwt.MapClaims {\n\t\t\tif v, ok := data.(int64); ok {\n\t\t\t\treturn jwt.MapClaims{\n\t\t\t\t\tconsts.IdentityKey: v,\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn jwt.MapClaims{}\n\t\t},\n\t\tAuthenticator: func(ctx context.Context, c *app.RequestContext) (interface{}, error) {\n\t\t\tvar err error\n\t\t\tvar req demoapi.CheckUserRequest\n\t\t\tif err = c.BindAndValidate(&req); err != nil {\n\t\t\t\treturn \"\", jwt.ErrMissingLoginValues\n\t\t\t}\n\t\t\tif len(req.Username) == 0 || len(req.Password) == 0 {\n\t\t\t\treturn \"\", jwt.ErrMissingLoginValues\n\t\t\t}\n\t\t\treturn rpc.CheckUser(context.Background(), &demouser.CheckUserRequest{\n\t\t\t\tUsername: req.Username,\n\t\t\t\tPassword: req.Password,\n\t\t\t})\n\t\t},\n\t\tLoginResponse: func(ctx context.Context, c *app.RequestContext, code int, token string, expire time.Time) {\n\t\t\tc.JSON(http.StatusOK, utils.H{\n\t\t\t\t\"code\":   errno.Success.ErrCode,\n\t\t\t\t\"token\":  token,\n\t\t\t\t\"expire\": expire.Format(time.RFC3339),\n\t\t\t})\n\t\t},\n\t\tUnauthorized: func(ctx context.Context, c *app.RequestContext, code int, message string) {\n\t\t\tc.JSON(http.StatusOK, utils.H{\n\t\t\t\t\"code\":    errno.AuthorizationFailedErr.ErrCode,\n\t\t\t\t\"message\": message,\n\t\t\t})\n\t\t},\n\t\tHTTPStatusMessageFunc: func(e error, ctx context.Context, c *app.RequestContext) string {\n\t\t\tswitch t := e.(type) {\n\t\t\tcase errno.ErrNo:\n\t\t\t\treturn t.ErrMsg\n\t\t\tdefault:\n\t\t\t\treturn t.Error()\n\t\t\t}\n\t\t},\n\t\tParseOptions: []jwtv4.ParserOption{jwtv4.WithJSONNumber()},\n\t})\n}\n"
  },
  {
    "path": "easy_note/cmd/api/router.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_handler\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_handler/demoapi\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// customizeRegister registers customize routers.\nfunc customizedRegister(r *server.Hertz) {\n\tr.GET(\"/ping\", hertz_handler.Ping)\n\n\t// your code ...\n\tr.NoRoute(func(ctx context.Context, c *app.RequestContext) { // used for HTTP 404\n\t\tdemoapi.SendResponse(c, errno.ServiceErr, nil)\n\t})\n\tr.NoMethod(func(ctx context.Context, c *app.RequestContext) { // used for HTTP 405\n\t\tdemoapi.SendResponse(c, errno.ServiceErr, nil)\n\t})\n}\n"
  },
  {
    "path": "easy_note/cmd/api/router_gen.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage main\n\nimport (\n\trouter \"github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_router\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// register registers all routers.\nfunc register(r *server.Hertz) {\n\n\trouter.GeneratedRegister(r)\n\n\tcustomizedRegister(r)\n}\n"
  },
  {
    "path": "easy_note/cmd/api/rpc/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage rpc\n\nfunc Init() {\n\tinitUser()\n\tinitNote()\n}\n"
  },
  {
    "path": "easy_note/cmd/api/rpc/note.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage rpc\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote/noteservice\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/mw\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nvar noteClient noteservice.Client\n\nfunc initNote() {\n\tr, err := etcd.NewEtcdResolver([]string{consts.ETCDAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := noteservice.NewClient(\n\t\tconsts.NoteServiceName,\n\t\tclient.WithResolver(r),\n\t\tclient.WithMuxConnection(1),\n\t\tclient.WithMiddleware(mw.CommonMiddleware),\n\t\tclient.WithInstanceMW(mw.ClientMiddleware),\n\t\tclient.WithSuite(tracing.NewClientSuite()),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: consts.ApiServiceName}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tnoteClient = c\n}\n\n// CreateNote create note info\nfunc CreateNote(ctx context.Context, req *demonote.CreateNoteRequest) error {\n\tresp, err := noteClient.CreateNote(ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n\n// QueryNotes query list of note info\nfunc QueryNotes(ctx context.Context, req *demonote.QueryNoteRequest) ([]*demonote.Note, int64, error) {\n\tresp, err := noteClient.QueryNote(ctx, req)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn nil, 0, errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.Notes, resp.Total, nil\n}\n\n// UpdateNote update note info\nfunc UpdateNote(ctx context.Context, req *demonote.UpdateNoteRequest) error {\n\tresp, err := noteClient.UpdateNote(ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n\n// DeleteNote delete note info\nfunc DeleteNote(ctx context.Context, req *demonote.DeleteNoteRequest) error {\n\tresp, err := noteClient.DeleteNote(ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "easy_note/cmd/api/rpc/user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage rpc\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser/userservice\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/mw\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nvar userClient userservice.Client\n\nfunc initUser() {\n\tr, err := etcd.NewEtcdResolver([]string{consts.ETCDAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := userservice.NewClient(\n\t\tconsts.UserServiceName,\n\t\tclient.WithResolver(r),\n\t\tclient.WithMuxConnection(1),\n\t\tclient.WithMiddleware(mw.CommonMiddleware),\n\t\tclient.WithInstanceMW(mw.ClientMiddleware),\n\t\tclient.WithSuite(tracing.NewClientSuite()),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: consts.ApiServiceName}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tuserClient = c\n}\n\n// CreateUser create user info\nfunc CreateUser(ctx context.Context, req *demouser.CreateUserRequest) error {\n\tresp, err := userClient.CreateUser(ctx, req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)\n\t}\n\treturn nil\n}\n\n// CheckUser check user info\nfunc CheckUser(ctx context.Context, req *demouser.CheckUserRequest) (int64, error) {\n\tresp, err := userClient.CheckUser(ctx, req)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn 0, errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)\n\t}\n\treturn resp.UserId, nil\n}\n"
  },
  {
    "path": "easy_note/cmd/api/script/bootstrap.sh",
    "content": "\n#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=hello.api\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}\n"
  },
  {
    "path": "easy_note/cmd/note/Makefile",
    "content": "kitex_gen_server:\n\tkitex --thrift-plugin validator -module github.com/cloudwego/biz-demo/easy_note -service demonote -use github.com/cloudwego/biz-demo/easy_note/kitex_gen ../../idl/note.thrift # execute in cmd/note"
  },
  {
    "path": "easy_note/cmd/note/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demonote\"\n\nmkdir -p output/bin\ncp script/* output/\nchmod +x output/bootstrap.sh\n\nif [ \"$IS_SYSTEM_TEST_ENV\" != \"1\" ]; then\n    go build -o output/bin/${RUN_NAME}\nelse\n    go test -c -covermode=set -o output/bin/${RUN_NAME} -coverpkg=./...\nfi\n"
  },
  {
    "path": "easy_note/cmd/note/dal/db/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage db\n\nimport (\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/logger\"\n\t\"gorm.io/plugin/opentelemetry/logging/logrus\"\n\t\"gorm.io/plugin/opentelemetry/tracing\"\n)\n\nvar DB *gorm.DB\n\n// Init init DB\nfunc Init() {\n\tvar err error\n\tgormlogrus := logger.New(\n\t\tlogrus.NewWriter(),\n\t\tlogger.Config{\n\t\t\tSlowThreshold: time.Millisecond,\n\t\t\tColorful:      false,\n\t\t\tLogLevel:      logger.Info,\n\t\t},\n\t)\n\tDB, err = gorm.Open(mysql.Open(consts.MySQLDefaultDSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt: true,\n\t\t\tLogger:      gormlogrus,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := DB.Use(tracing.NewPlugin()); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "easy_note/cmd/note/dal/db/note.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage db\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"gorm.io/gorm\"\n)\n\ntype Note struct {\n\tgorm.Model\n\tUserID  int64  `json:\"user_id\"`\n\tTitle   string `json:\"title\"`\n\tContent string `json:\"content\"`\n}\n\nfunc (n *Note) TableName() string {\n\treturn consts.NoteTableName\n}\n\n// CreateNote create note info\nfunc CreateNote(ctx context.Context, notes []*Note) error {\n\tif err := DB.WithContext(ctx).Create(notes).Error; err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// MGetNotes multiple get list of note info\nfunc MGetNotes(ctx context.Context, noteIDs []int64) ([]*Note, error) {\n\tvar res []*Note\n\tif len(noteIDs) == 0 {\n\t\treturn res, nil\n\t}\n\n\tif err := DB.WithContext(ctx).Where(\"id in ?\", noteIDs).Find(&res).Error; err != nil {\n\t\treturn res, err\n\t}\n\treturn res, nil\n}\n\n// UpdateNote update note info\nfunc UpdateNote(ctx context.Context, noteID, userID int64, title, content *string) error {\n\tparams := map[string]interface{}{}\n\tif title != nil {\n\t\tparams[\"title\"] = *title\n\t}\n\tif content != nil {\n\t\tparams[\"content\"] = *content\n\t}\n\treturn DB.WithContext(ctx).Model(&Note{}).Where(\"id = ? and user_id = ?\", noteID, userID).\n\t\tUpdates(params).Error\n}\n\n// DeleteNote delete note info\nfunc DeleteNote(ctx context.Context, noteID, userID int64) error {\n\treturn DB.WithContext(ctx).Where(\"id = ? and user_id = ? \", noteID, userID).Delete(&Note{}).Error\n}\n\n// QueryNote query list of note info\nfunc QueryNote(ctx context.Context, userID int64, searchKey *string, limit, offset int) ([]*Note, int64, error) {\n\tvar total int64\n\tvar res []*Note\n\tconn := DB.WithContext(ctx).Model(&Note{}).Where(\"user_id = ?\", userID)\n\n\tif searchKey != nil {\n\t\tconn = conn.Where(\"title like ?\", \"%\"+*searchKey+\"%\")\n\t}\n\n\tif err := conn.Count(&total).Error; err != nil {\n\t\treturn res, total, err\n\t}\n\n\tif err := conn.Limit(limit).Offset(offset).Find(&res).Error; err != nil {\n\t\treturn res, total, err\n\t}\n\n\treturn res, total, nil\n}\n"
  },
  {
    "path": "easy_note/cmd/note/dal/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage dal\n\nimport \"github.com/cloudwego/biz-demo/easy_note/cmd/note/dal/db\"\n\n// Init init dal\nfunc Init() {\n\tdb.Init() // mysql init\n}\n"
  },
  {
    "path": "easy_note/cmd/note/handler.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/pack\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/service\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n)\n\n// NoteServiceImpl implements the last service interface defined in the IDL.\ntype NoteServiceImpl struct{}\n\n// CreateNote implements the NoteServiceImpl interface.\nfunc (s *NoteServiceImpl) CreateNote(ctx context.Context, req *demonote.CreateNoteRequest) (resp *demonote.CreateNoteResponse, err error) {\n\tresp = new(demonote.CreateNoteResponse)\n\n\tif err = req.IsValid(); err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\terr = service.NewCreateNoteService(ctx).CreateNote(req)\n\tif err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.BaseResp = pack.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n\n// DeleteNote implements the NoteServiceImpl interface.\nfunc (s *NoteServiceImpl) DeleteNote(ctx context.Context, req *demonote.DeleteNoteRequest) (resp *demonote.DeleteNoteResponse, err error) {\n\tresp = new(demonote.DeleteNoteResponse)\n\n\tif err = req.IsValid(); err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\terr = service.NewDelNoteService(ctx).DelNote(req)\n\tif err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.BaseResp = pack.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n\n// UpdateNote implements the NoteServiceImpl interface.\nfunc (s *NoteServiceImpl) UpdateNote(ctx context.Context, req *demonote.UpdateNoteRequest) (resp *demonote.UpdateNoteResponse, err error) {\n\tresp = new(demonote.UpdateNoteResponse)\n\n\tif err = req.IsValid(); err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\terr = service.NewUpdateNoteService(ctx).UpdateNote(req)\n\tif err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.BaseResp = pack.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n\n// QueryNote implements the NoteServiceImpl interface.\nfunc (s *NoteServiceImpl) QueryNote(ctx context.Context, req *demonote.QueryNoteRequest) (resp *demonote.QueryNoteResponse, err error) {\n\tresp = new(demonote.QueryNoteResponse)\n\n\tif err = req.IsValid(); err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\tif req.Limit == 0 {\n\t\treq.Limit = consts.DefaultLimit\n\t}\n\n\tnotes, total, err := service.NewQueryNoteService(ctx).QueryNoteService(req)\n\tif err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.BaseResp = pack.BuildBaseResp(errno.Success)\n\tresp.Notes = notes\n\tresp.Total = total\n\treturn resp, nil\n}\n\n// MGetNote implements the NoteServiceImpl interface.\nfunc (s *NoteServiceImpl) MGetNote(ctx context.Context, req *demonote.MGetNoteRequest) (resp *demonote.MGetNoteResponse, err error) {\n\tresp = new(demonote.MGetNoteResponse)\n\n\tif err = req.IsValid(); err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\tnotes, err := service.NewMGetNoteService(ctx).MGetNote(req)\n\tif err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\tresp.BaseResp = pack.BuildBaseResp(errno.Success)\n\tresp.Notes = notes\n\treturn resp, nil\n}\n"
  },
  {
    "path": "easy_note/cmd/note/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/dal\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/rpc\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote/noteservice\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/mw\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/limit\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nfunc Init() {\n\trpc.Init()\n\tdal.Init()\n\t// klog init\n\tklog.SetLogger(kitexlogrus.NewLogger())\n\tklog.SetLevel(klog.LevelInfo)\n}\n\nfunc main() {\n\tr, err := etcd.NewEtcdRegistry([]string{consts.ETCDAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\taddr, err := net.ResolveTCPAddr(consts.TCP, consts.NoteServiceAddr)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tInit()\n\tp := provider.NewOpenTelemetryProvider(\n\t\tprovider.WithServiceName(consts.NoteServiceName),\n\t\tprovider.WithExportEndpoint(consts.ExportEndpoint),\n\t\tprovider.WithInsecure(),\n\t)\n\tdefer func(ctx context.Context, p provider.OtelProvider) {\n\t\t_ = p.Shutdown(ctx)\n\t}(context.Background(), p)\n\tsvr := noteservice.NewServer(new(NoteServiceImpl),\n\t\tserver.WithServiceAddr(addr),\n\t\tserver.WithRegistry(r),\n\t\tserver.WithLimit(&limit.Option{MaxConnections: 1000, MaxQPS: 100}),\n\t\tserver.WithMuxTransport(),\n\t\tserver.WithMiddleware(mw.CommonMiddleware),\n\t\tserver.WithMiddleware(mw.ServerMiddleware),\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: consts.NoteServiceName}),\n\t)\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "easy_note/cmd/note/pack/note.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage pack\n\nimport (\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n)\n\n// Note pack note info\nfunc Note(m *db.Note) *demonote.Note {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\treturn &demonote.Note{\n\t\tNoteId:     int64(m.ID),\n\t\tUserId:     m.UserID,\n\t\tTitle:      m.Title,\n\t\tContent:    m.Content,\n\t\tCreateTime: m.CreatedAt.Unix(),\n\t}\n}\n\n// Notes pack list of note info\nfunc Notes(ms []*db.Note) []*demonote.Note {\n\tnotes := make([]*demonote.Note, 0)\n\tfor _, m := range ms {\n\t\tif n := Note(m); n != nil {\n\t\t\tnotes = append(notes, n)\n\t\t}\n\t}\n\treturn notes\n}\n\nfunc UserIds(ms []*db.Note) []int64 {\n\tuIds := make([]int64, 0)\n\tif len(ms) == 0 {\n\t\treturn uIds\n\t}\n\tuIdMap := make(map[int64]struct{})\n\tfor _, m := range ms {\n\t\tif m != nil {\n\t\t\tuIdMap[m.UserID] = struct{}{}\n\t\t}\n\t}\n\tfor uId := range uIdMap {\n\t\tuIds = append(uIds, uId)\n\t}\n\treturn uIds\n}\n"
  },
  {
    "path": "easy_note/cmd/note/pack/resp.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage pack\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n)\n\n// BuildBaseResp build baseResp from error\nfunc BuildBaseResp(err error) *demonote.BaseResp {\n\tif err == nil {\n\t\treturn baseResp(errno.Success)\n\t}\n\te := errno.ErrNo{}\n\tif errors.As(err, &e) {\n\t\treturn baseResp(e)\n\t}\n\ts := errno.ServiceErr.WithMessage(err.Error())\n\treturn baseResp(s)\n}\n\nfunc baseResp(err errno.ErrNo) *demonote.BaseResp {\n\treturn &demonote.BaseResp{\n\t\tStatusCode:    err.ErrCode,\n\t\tStatusMessage: err.ErrMsg,\n\t\tServiceTime:   time.Now().Unix(),\n\t}\n}\n"
  },
  {
    "path": "easy_note/cmd/note/rpc/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage rpc\n\n// Init init rpc client\nfunc Init() {\n\tinitUser()\n}\n"
  },
  {
    "path": "easy_note/cmd/note/rpc/user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage rpc\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser/userservice\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/mw\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nvar userClient userservice.Client\n\nfunc initUser() {\n\tr, err := etcd.NewEtcdResolver([]string{consts.ETCDAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tp := provider.NewOpenTelemetryProvider(\n\t\tprovider.WithServiceName(consts.NoteServiceName),\n\t\tprovider.WithExportEndpoint(consts.ExportEndpoint),\n\t\tprovider.WithInsecure(),\n\t)\n\tdefer func(ctx context.Context, p provider.OtelProvider) {\n\t\t_ = p.Shutdown(ctx)\n\t}(context.Background(), p)\n\tc, err := userservice.NewClient(\n\t\tconsts.UserServiceName, // DestService\n\t\tclient.WithResolver(r),\n\t\tclient.WithMuxConnection(1),\n\t\tclient.WithMiddleware(mw.CommonMiddleware),\n\t\tclient.WithInstanceMW(mw.ClientMiddleware),\n\t\tclient.WithSuite(tracing.NewClientSuite()),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: consts.NoteServiceName}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tuserClient = c\n}\n\n// MGetUser multiple get list of user info\nfunc MGetUser(ctx context.Context, req *demouser.MGetUserRequest) (map[int64]*demouser.User, error) {\n\tresp, err := userClient.MGetUser(ctx, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.BaseResp.StatusCode != 0 {\n\t\treturn nil, errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)\n\t}\n\tres := make(map[int64]*demouser.User)\n\tfor _, u := range resp.Users {\n\t\tres[u.UserId] = u\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "easy_note/cmd/note/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\n\nif [ \"X$1\" != \"X\" ]; then\n    RUNTIME_ROOT=$1\nelse\n    RUNTIME_ROOT=${CURDIR}\nfi\n\nexport KITEX_RUNTIME_ROOT=$RUNTIME_ROOT\nexport KITEX_LOG_DIR=\"$RUNTIME_ROOT/log\"\n\nif [ ! -d \"$KITEX_LOG_DIR/app\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/app\"\nfi\n\nif [ ! -d \"$KITEX_LOG_DIR/rpc\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/rpc\"\nfi\n\nexec \"$CURDIR/bin/demonote\"\n"
  },
  {
    "path": "easy_note/cmd/note/service/create_note.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n)\n\ntype CreateNoteService struct {\n\tctx context.Context\n}\n\n// NewCreateNoteService new CreateNoteService\nfunc NewCreateNoteService(ctx context.Context) *CreateNoteService {\n\treturn &CreateNoteService{ctx: ctx}\n}\n\n// CreateNote create note info\nfunc (s *CreateNoteService) CreateNote(req *demonote.CreateNoteRequest) error {\n\tnoteModel := &db.Note{\n\t\tUserID:  req.UserId,\n\t\tTitle:   req.Title,\n\t\tContent: req.Content,\n\t}\n\treturn db.CreateNote(s.ctx, []*db.Note{noteModel})\n}\n"
  },
  {
    "path": "easy_note/cmd/note/service/delete_note.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n)\n\ntype DelNoteService struct {\n\tctx context.Context\n}\n\n// NewDelNoteService new DelNoteService\nfunc NewDelNoteService(ctx context.Context) *DelNoteService {\n\treturn &DelNoteService{\n\t\tctx: ctx,\n\t}\n}\n\n// DelNote delete note info\nfunc (s *DelNoteService) DelNote(req *demonote.DeleteNoteRequest) error {\n\treturn db.DeleteNote(s.ctx, req.NoteId, req.UserId)\n}\n"
  },
  {
    "path": "easy_note/cmd/note/service/mget_note.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/pack\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/rpc\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n)\n\ntype MGetNoteService struct {\n\tctx context.Context\n}\n\n// NewMGetNoteService new MGetNoteService\nfunc NewMGetNoteService(ctx context.Context) *MGetNoteService {\n\treturn &MGetNoteService{ctx: ctx}\n}\n\n// MGetNote multiple get list of note info\nfunc (s *MGetNoteService) MGetNote(req *demonote.MGetNoteRequest) ([]*demonote.Note, error) {\n\tnoteModels, err := db.MGetNotes(s.ctx, req.NoteIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tuIds := pack.UserIds(noteModels)\n\tuserMap, err := rpc.MGetUser(s.ctx, &demouser.MGetUserRequest{UserIds: uIds})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnotes := pack.Notes(noteModels)\n\tfor i := 0; i < len(notes); i++ {\n\t\tif u, ok := userMap[notes[i].UserId]; ok {\n\t\t\tnotes[i].Username = u.Username\n\t\t\tnotes[i].UserAvatar = u.Avatar\n\t\t}\n\t}\n\treturn notes, nil\n}\n"
  },
  {
    "path": "easy_note/cmd/note/service/query_note.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/pack\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/rpc\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n)\n\ntype QueryNoteService struct {\n\tctx context.Context\n}\n\n// NewQueryNoteService new QueryNoteService\nfunc NewQueryNoteService(ctx context.Context) *QueryNoteService {\n\treturn &QueryNoteService{ctx: ctx}\n}\n\n// QueryNoteService query list of note info\nfunc (s *QueryNoteService) QueryNoteService(req *demonote.QueryNoteRequest) ([]*demonote.Note, int64, error) {\n\tnoteModels, total, err := db.QueryNote(s.ctx, req.UserId, req.SearchKey, int(req.Limit), int(req.Offset))\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\tuserMap, err := rpc.MGetUser(s.ctx, &demouser.MGetUserRequest{UserIds: []int64{req.UserId}})\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\tnotes := pack.Notes(noteModels)\n\tfor i := 0; i < len(notes); i++ {\n\t\tif u, ok := userMap[notes[i].UserId]; ok {\n\t\t\tnotes[i].Username = u.Username\n\t\t\tnotes[i].UserAvatar = u.Avatar\n\t\t}\n\t}\n\treturn notes, total, nil\n}\n"
  },
  {
    "path": "easy_note/cmd/note/service/update_note.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/note/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n)\n\ntype UpdateNoteService struct {\n\tctx context.Context\n}\n\n// NewUpdateNoteService new UpdateNoteService\nfunc NewUpdateNoteService(ctx context.Context) *UpdateNoteService {\n\treturn &UpdateNoteService{ctx: ctx}\n}\n\n// UpdateNote update note info\nfunc (s *UpdateNoteService) UpdateNote(req *demonote.UpdateNoteRequest) error {\n\treturn db.UpdateNote(s.ctx, req.NoteId, req.UserId, req.Title, req.Content)\n}\n"
  },
  {
    "path": "easy_note/cmd/user/Makefile",
    "content": "kitex_gen_server:\n\tkitex --thrift-plugin validator -module github.com/cloudwego/biz-demo/easy_note -service demouser -use github.com/cloudwego/biz-demo/easy_note/kitex_gen ../../idl/user.thrift # execute in cmd/user"
  },
  {
    "path": "easy_note/cmd/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demouser\"\n\nmkdir -p output/bin\ncp script/* output/\nchmod +x output/bootstrap.sh\n\nif [ \"$IS_SYSTEM_TEST_ENV\" != \"1\" ]; then\n    go build -o output/bin/${RUN_NAME}\nelse\n    go test -c -covermode=set -o output/bin/${RUN_NAME} -coverpkg=./...\nfi\n"
  },
  {
    "path": "easy_note/cmd/user/dal/db/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage db\n\nimport (\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/logger\"\n\t\"gorm.io/plugin/opentelemetry/logging/logrus\"\n\t\"gorm.io/plugin/opentelemetry/tracing\"\n)\n\nvar DB *gorm.DB\n\n// Init init DB\nfunc Init() {\n\tvar err error\n\tgormlogrus := logger.New(\n\t\tlogrus.NewWriter(),\n\t\tlogger.Config{\n\t\t\tSlowThreshold: time.Millisecond,\n\t\t\tColorful:      false,\n\t\t\tLogLevel:      logger.Info,\n\t\t},\n\t)\n\tDB, err = gorm.Open(mysql.Open(consts.MySQLDefaultDSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt: true,\n\t\t\tLogger:      gormlogrus,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif err := DB.Use(tracing.NewPlugin()); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "easy_note/cmd/user/dal/db/user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage db\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tgorm.Model\n\tUsername string `json:\"username\"`\n\tPassword string `json:\"password\"`\n}\n\nfunc (u *User) TableName() string {\n\treturn consts.UserTableName\n}\n\n// MGetUsers multiple get list of user info\nfunc MGetUsers(ctx context.Context, userIDs []int64) ([]*User, error) {\n\tres := make([]*User, 0)\n\tif len(userIDs) == 0 {\n\t\treturn res, nil\n\t}\n\n\tif err := DB.WithContext(ctx).Where(\"id in ?\", userIDs).Find(&res).Error; err != nil {\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// CreateUser create user info\nfunc CreateUser(ctx context.Context, users []*User) error {\n\treturn DB.WithContext(ctx).Create(users).Error\n}\n\n// QueryUser query list of user info\nfunc QueryUser(ctx context.Context, userName string) ([]*User, error) {\n\tres := make([]*User, 0)\n\tif err := DB.WithContext(ctx).Where(\"username = ?\", userName).Find(&res).Error; err != nil {\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "easy_note/cmd/user/dal/init.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage dal\n\nimport \"github.com/cloudwego/biz-demo/easy_note/cmd/user/dal/db\"\n\n// Init init dal\nfunc Init() {\n\tdb.Init() // mysql init\n}\n"
  },
  {
    "path": "easy_note/cmd/user/handler.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/user/pack\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/user/service\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// CreateUser implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) CreateUser(ctx context.Context, req *demouser.CreateUserRequest) (resp *demouser.CreateUserResponse, err error) {\n\tresp = new(demouser.CreateUserResponse)\n\n\tif err = req.IsValid(); err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\terr = service.NewCreateUserService(ctx).CreateUser(req)\n\tif err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\tresp.BaseResp = pack.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n\n// MGetUser implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) MGetUser(ctx context.Context, req *demouser.MGetUserRequest) (resp *demouser.MGetUserResponse, err error) {\n\tresp = new(demouser.MGetUserResponse)\n\n\tif err = req.IsValid(); err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\tusers, err := service.NewMGetUserService(ctx).MGetUser(req)\n\tif err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\tresp.BaseResp = pack.BuildBaseResp(errno.Success)\n\tresp.Users = users\n\treturn resp, nil\n}\n\n// CheckUser implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) CheckUser(ctx context.Context, req *demouser.CheckUserRequest) (resp *demouser.CheckUserResponse, err error) {\n\tresp = new(demouser.CheckUserResponse)\n\n\tif err = req.IsValid(); err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(errno.ParamErr)\n\t\treturn resp, nil\n\t}\n\n\tuid, err := service.NewCheckUserService(ctx).CheckUser(req)\n\tif err != nil {\n\t\tresp.BaseResp = pack.BuildBaseResp(err)\n\t\treturn resp, nil\n\t}\n\n\tresp.UserId = uid\n\tresp.BaseResp = pack.BuildBaseResp(errno.Success)\n\treturn resp, nil\n}\n"
  },
  {
    "path": "easy_note/cmd/user/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/user/dal\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser/userservice\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/consts\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/mw\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/limit\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tetcd \"github.com/kitex-contrib/registry-etcd\"\n)\n\nfunc Init() {\n\tdal.Init()\n\t// klog init\n\tklog.SetLogger(kitexlogrus.NewLogger())\n\tklog.SetLevel(klog.LevelInfo)\n}\n\nfunc main() {\n\tr, err := etcd.NewEtcdRegistry([]string{consts.ETCDAddress})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\taddr, err := net.ResolveTCPAddr(consts.TCP, consts.UserServiceAddr)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tInit()\n\tp := provider.NewOpenTelemetryProvider(\n\t\tprovider.WithServiceName(consts.UserServiceName),\n\t\tprovider.WithExportEndpoint(consts.ExportEndpoint),\n\t\tprovider.WithInsecure(),\n\t)\n\tdefer func(ctx context.Context, p provider.OtelProvider) {\n\t\t_ = p.Shutdown(ctx)\n\t}(context.Background(), p)\n\tsvr := userservice.NewServer(new(UserServiceImpl),\n\t\tserver.WithServiceAddr(addr),\n\t\tserver.WithRegistry(r),\n\t\tserver.WithLimit(&limit.Option{MaxConnections: 1000, MaxQPS: 100}),\n\t\tserver.WithMuxTransport(),\n\t\tserver.WithMiddleware(mw.CommonMiddleware),\n\t\tserver.WithMiddleware(mw.ServerMiddleware),\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: consts.UserServiceName}),\n\t)\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "easy_note/cmd/user/pack/resp.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage pack\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n)\n\n// BuildBaseResp build baseResp from error\nfunc BuildBaseResp(err error) *demouser.BaseResp {\n\tif err == nil {\n\t\treturn baseResp(errno.Success)\n\t}\n\n\te := errno.ErrNo{}\n\tif errors.As(err, &e) {\n\t\treturn baseResp(e)\n\t}\n\n\ts := errno.ServiceErr.WithMessage(err.Error())\n\treturn baseResp(s)\n}\n\nfunc baseResp(err errno.ErrNo) *demouser.BaseResp {\n\treturn &demouser.BaseResp{StatusCode: err.ErrCode, StatusMessage: err.ErrMsg, ServiceTime: time.Now().Unix()}\n}\n"
  },
  {
    "path": "easy_note/cmd/user/pack/user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage pack\n\nimport (\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/user/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n)\n\n// User pack user info\nfunc User(u *db.User) *demouser.User {\n\tif u == nil {\n\t\treturn nil\n\t}\n\n\treturn &demouser.User{UserId: int64(u.ID), Username: u.Username, Avatar: \"test\"}\n}\n\n// Users pack list of user info\nfunc Users(us []*db.User) []*demouser.User {\n\tusers := make([]*demouser.User, 0)\n\tfor _, u := range us {\n\t\tif temp := User(u); temp != nil {\n\t\t\tusers = append(users, temp)\n\t\t}\n\t}\n\treturn users\n}\n"
  },
  {
    "path": "easy_note/cmd/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\n\nif [ \"X$1\" != \"X\" ]; then\n    RUNTIME_ROOT=$1\nelse\n    RUNTIME_ROOT=${CURDIR}\nfi\n\nexport KITEX_RUNTIME_ROOT=$RUNTIME_ROOT\nexport KITEX_LOG_DIR=\"$RUNTIME_ROOT/log\"\n\nif [ ! -d \"$KITEX_LOG_DIR/app\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/app\"\nfi\n\nif [ ! -d \"$KITEX_LOG_DIR/rpc\" ]; then\n    mkdir -p \"$KITEX_LOG_DIR/rpc\"\nfi\n\nexec \"$CURDIR/bin/demouser\"\n"
  },
  {
    "path": "easy_note/cmd/user/service/check_user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\t\"crypto/md5\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/user/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n)\n\ntype CheckUserService struct {\n\tctx context.Context\n}\n\n// NewCheckUserService new CheckUserService\nfunc NewCheckUserService(ctx context.Context) *CheckUserService {\n\treturn &CheckUserService{\n\t\tctx: ctx,\n\t}\n}\n\n// CheckUser check user info\nfunc (s *CheckUserService) CheckUser(req *demouser.CheckUserRequest) (int64, error) {\n\th := md5.New()\n\tif _, err := io.WriteString(h, req.Password); err != nil {\n\t\treturn 0, err\n\t}\n\tpassWord := fmt.Sprintf(\"%x\", h.Sum(nil))\n\n\tuserName := req.Username\n\tusers, err := db.QueryUser(s.ctx, userName)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif len(users) == 0 {\n\t\treturn 0, errno.AuthorizationFailedErr\n\t}\n\tu := users[0]\n\tif u.Password != passWord {\n\t\treturn 0, errno.AuthorizationFailedErr\n\t}\n\treturn int64(u.ID), nil\n}\n"
  },
  {
    "path": "easy_note/cmd/user/service/create_user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\t\"crypto/md5\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/user/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\t\"github.com/cloudwego/biz-demo/easy_note/pkg/errno\"\n)\n\ntype CreateUserService struct {\n\tctx context.Context\n}\n\n// NewCreateUserService new CreateUserService\nfunc NewCreateUserService(ctx context.Context) *CreateUserService {\n\treturn &CreateUserService{ctx: ctx}\n}\n\n// CreateUser create user info.\nfunc (s *CreateUserService) CreateUser(req *demouser.CreateUserRequest) error {\n\tusers, err := db.QueryUser(s.ctx, req.Username)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(users) != 0 {\n\t\treturn errno.UserAlreadyExistErr\n\t}\n\n\th := md5.New()\n\tif _, err = io.WriteString(h, req.Password); err != nil {\n\t\treturn err\n\t}\n\tpassword := fmt.Sprintf(\"%x\", h.Sum(nil))\n\treturn db.CreateUser(s.ctx, []*db.User{{\n\t\tUsername: req.Username,\n\t\tPassword: password,\n\t}})\n}\n"
  },
  {
    "path": "easy_note/cmd/user/service/mget_user.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/user/dal/db\"\n\t\"github.com/cloudwego/biz-demo/easy_note/cmd/user/pack\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n)\n\ntype MGetUserService struct {\n\tctx context.Context\n}\n\n// NewMGetUserService new MGetUserService\nfunc NewMGetUserService(ctx context.Context) *MGetUserService {\n\treturn &MGetUserService{ctx: ctx}\n}\n\n// MGetUser multiple get list of user info\nfunc (s *MGetUserService) MGetUser(req *demouser.MGetUserRequest) ([]*demouser.User, error) {\n\tmodelUsers, err := db.MGetUsers(s.ctx, req.UserIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn pack.Users(modelUsers), nil\n}\n"
  },
  {
    "path": "easy_note/docker-compose.yaml",
    "content": "version: \"3.7\"\nservices:\n  # MySQL\n  mysql:\n    image: mysql:latest\n    volumes:\n      - ./pkg/configs/sql:/docker-entrypoint-initdb.d\n    ports:\n      - \"3306:3306\"\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n\n  # ETCD\n  Etcd:\n    image: 'bitnami/etcd:latest'\n    environment:\n      - ALLOW_NONE_AUTHENTICATION=yes\n      - ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379\n    ports:\n      - \"2379:2379\"\n      - \"2380:2380\"\n\n  # Collector\n  otel-collector:\n    image: otel/opentelemetry-collector-contrib-dev:latest\n    command: [ \"--config=/etc/otel-collector-config.yaml\", \"${OTELCOL_ARGS}\" ]\n    volumes:\n      - ./pkg/configs/otel/otel-collector-config.yaml:/etc/otel-collector-config.yaml\n    ports:\n      - \"1888:1888\"   # pprof extension\n      - \"8888\"        # Prometheus metrics exposed by the collector\n      - \"8889:8889\"   # Prometheus exporter metrics\n      - \"13133:13133\" # health_check extension\n      - \"4317:4317\"   # OTLP gRPC receiver\n      - \"55679\"       # zpages extension\n    depends_on:\n      - jaeger-all-in-one\n\n  # Jaeger\n  jaeger-all-in-one:\n    image: jaegertracing/all-in-one:latest\n    environment:\n      - COLLECTOR_OTLP_ENABLED=true\n    ports:\n      - \"16686:16686\"\n      - \"14268\"\n      - \"14250:14250\"\n      - \"6831:6831\"\n      - \"4317\"   # OTLP gRPC receiver\n\n  # Victoriametrics\n  victoriametrics:\n    container_name: victoriametrics\n    image: victoriametrics/victoria-metrics\n    ports:\n      - \"8428:8428\"\n      - \"8089:8089\"\n      - \"8089:8089/udp\"\n      - \"2003:2003\"\n      - \"2003:2003/udp\"\n      - \"4242:4242\"\n    command:\n      - '--storageDataPath=/storage'\n      - '--graphiteListenAddr=:2003'\n      - '--opentsdbListenAddr=:4242'\n      - '--httpListenAddr=:8428'\n      - '--influxListenAddr=:8089'\n    restart: always\n\n  # Grafana\n  grafana:\n    image: grafana/grafana:latest\n    environment:\n      - GF_AUTH_ANONYMOUS_ENABLED=true\n      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin\n      - GF_AUTH_DISABLE_LOGIN_FORM=true\n    ports:\n      - \"3000:3000\"\n"
  },
  {
    "path": "easy_note/go.mod",
    "content": "module github.com/cloudwego/biz-demo/easy_note\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.16.0\n\tgithub.com/cloudwego/hertz v0.9.5\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/golang-jwt/jwt/v4 v4.5.2\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/jwt v1.0.2\n\tgithub.com/hertz-contrib/obs-opentelemetry/logging/logrus v0.1.1\n\tgithub.com/hertz-contrib/obs-opentelemetry/tracing v0.4.1\n\tgithub.com/hertz-contrib/pprof v0.1.2\n\tgithub.com/hertz-contrib/requestid v1.1.0\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.7\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20230219092456-5e6c84962323\n\tgithub.com/kitex-contrib/registry-etcd v0.2.2\n\tgo.opentelemetry.io/otel/trace v1.27.0\n\tgorm.io/driver/mysql v1.4.4\n\tgorm.io/gorm v1.25.10\n\tgorm.io/plugin/opentelemetry v0.1.4\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/coreos/go-semver v0.3.0 // indirect\n\tgithub.com/coreos/go-systemd/v22 v22.3.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.6.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.6.0 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/google/uuid v1.3.1 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.1.6 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.etcd.io/etcd/api/v3 v3.5.12 // indirect\n\tgo.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect\n\tgo.etcd.io/etcd/client/v3 v3.5.12 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.27.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.27.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.27.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.31.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "easy_note/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20210705062217-74c74ebadcae/go.mod h1:birsdqRCbwnckJbdAvcSao+AzOyibVEoWB55MjpYpB8=\ngithub.com/bytedance/gopkg v0.0.0-20210910103821-e4efae9c17c3/go.mod h1:birsdqRCbwnckJbdAvcSao+AzOyibVEoWB55MjpYpB8=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.12 h1:aeszOmGw8CPX8CRx1DZ/Glzb1yXvhjDh6jdFBNZjsU4=\ngithub.com/bytedance/mockey v1.2.12/go.mod h1:3ZA4MQasmqC87Tw0w7Ygdy7eHIc2xgpZ8Pona5rsYIk=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/choleraehyq/pid v0.0.12/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.4.2/go.mod h1:K1U0RlU07CDeBINfHNbafH/3j9uSgIW8otbjUys3OPY=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.9.5 h1:FXV2YFLrNHRdpwT+OoIvv0wEHUC0Bo68CDPujr6VnWo=\ngithub.com/cloudwego/hertz v0.9.5/go.mod h1:UUBt8N8hSTStz7NEvLZ5mnALpBSofNL4DoYzIIp8UaY=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.2.0/go.mod h1:1p4rtGIIiFZMOePYbSPgLkIhdhdfhEtVOJSti/k9vK4=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.1.0/go.mod h1:rZOiNI0FYjuvNybXKKhAPUja03loJi/cdv2F55AE6E8=\ngithub.com/cloudwego/netpoll v0.2.0/go.mod h1:rZOiNI0FYjuvNybXKKhAPUja03loJi/cdv2F55AE6E8=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/netpoll-http2 v0.0.6/go.mod h1:+bjPyu2Cd4GDzKa0IegPgp1hjMjpZ6/kXTsSjIsmUk8=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\ngithub.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=\ngithub.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=\ngithub.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=\ngithub.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=\ngithub.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=\ngithub.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/jwt v1.0.2 h1:sAW3wqgBDsbPKr5JWJRObY61jg1NqYkUCg+o8UXLsaI=\ngithub.com/hertz-contrib/jwt v1.0.2/go.mod h1:3zUSK+44dcw/9z/89JZ+mA0FoyhmVN7Hx+f46ucVV4I=\ngithub.com/hertz-contrib/obs-opentelemetry/logging/logrus v0.1.1 h1:4KR/JoIc8PSbVucOzsLSJOtVgDowwNG6/C/GkrpPXHI=\ngithub.com/hertz-contrib/obs-opentelemetry/logging/logrus v0.1.1/go.mod h1:dLQsSFKUVF4pya7kLlF6l1T69+mOPObotXGJO8ptbho=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.4.1 h1:YOv/UcSHjeAg1CwvcXi1zsNz5xFKf1iAKlEKAt7k31I=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.4.1/go.mod h1:u+EVWM4dDcudoXY4bCia0EyhaBOsPgRah+FvM75DM7s=\ngithub.com/hertz-contrib/pprof v0.1.2 h1:eC4jpg8ToSi+9YEOPIr3jki8e/ix3aFPtphCgJ36T6Q=\ngithub.com/hertz-contrib/pprof v0.1.2/go.mod h1:OKXw5wCUcy1OVwgQLsoCS9JzfcdjoofP+7Uk4c7P9Po=\ngithub.com/hertz-contrib/requestid v1.1.0 h1:+y1cuNlNX2KUoEC1SnBJ6M55/TlMTx3M9yxkqi0oTkk=\ngithub.com/hertz-contrib/requestid v1.1.0/go.mod h1:+l5CbZl//cSUoos421fnDFKQ6YYlVHcYc3Ri7AS8DUA=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=\ngithub.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.7 h1:at3LBOR6n2QPzP6UyASBUJUte/1bThoVAGx9SbTte2c=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.7/go.mod h1:D/MrXWtvZY5ZeNxw8KWx+da8g17N5aT0CkedbUzvmGE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20230219092456-5e6c84962323 h1:hwJsa1WoC28vzzQiE5H1Pvdd7DjO99zpxUoh7B41lDA=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20230219092456-5e6c84962323/go.mod h1:Eml/0Z+CqgGIPf9JXzLGu+N9NJoy2x5pqypN+hmKArE=\ngithub.com/kitex-contrib/registry-etcd v0.2.2 h1:ebrqLpZrkSLSyazD6mrplV3m80GavSnjUusjhf+fvmc=\ngithub.com/kitex-contrib/registry-etcd v0.2.2/go.mod h1:Imgvy+EkqExHuJs4+VFK0g1bFWHaCJ0KuK1sofWYZf4=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI=\ngithub.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/nyaruka/phonenumbers v1.1.6 h1:DcueYq7QrOArAprAYNoQfDgp0KetO4LqtnBtQC6Wyes=\ngithub.com/nyaruka/phonenumbers v1.1.6/go.mod h1:yShPJHDSH3aTKzCbXyVxNpbl2kA+F+Ne5Pun/MvFRos=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=\ngithub.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=\ngithub.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=\ngithub.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=\ngithub.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=\ngithub.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=\ngithub.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA=\ngo.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=\ngo.etcd.io/etcd/api/v3 v3.5.12 h1:W4sw5ZoU2Juc9gBWuLk5U6fHfNVyY1WC5g9uiXZio/c=\ngo.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarindU2A=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4=\ngo.etcd.io/etcd/client/v2 v2.305.12 h1:0m4ovXYo1CHaA/Mp3X/Fak5sRNIWf01wk/X1/G3sGKI=\ngo.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E=\ngo.etcd.io/etcd/client/v3 v3.5.12 h1:v5lCPXn1pf1Uu3M4laUE2hp/geOTc5uPcYYsNe1lDxg=\ngo.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw=\ngo.etcd.io/etcd/pkg/v3 v3.5.12 h1:OK2fZKI5hX/+BTK76gXSTyZMrbnARyX9S643GenNGb8=\ngo.etcd.io/etcd/pkg/v3 v3.5.12/go.mod h1:UVwg/QIMoJncyeb/YxvJBJCE/NEwtHWashqc8A1nj/M=\ngo.etcd.io/etcd/raft/v3 v3.5.12 h1:7r22RufdDsq2z3STjoR7Msz6fYH8tmbkdheGfwJNRmU=\ngo.etcd.io/etcd/raft/v3 v3.5.12/go.mod h1:ERQuZVe79PI6vcC3DlKBukDCLja/L7YMu29B74Iwj4U=\ngo.etcd.io/etcd/server/v3 v3.5.12 h1:EtMjsbfyfkwZuA2JlKOiBfuGkFCekv5H178qjXypbG8=\ngo.etcd.io/etcd/server/v3 v3.5.12/go.mod h1:axB0oCjMy+cemo5290/CutIjoxlfA6KVYKD1w0uue10=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0 h1:PzIubN4/sjByhDRHLviCjJuweBXWFZWhghjg7cS28+M=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0/go.mod h1:Ct6zzQEuGK3WpJs2n4dn+wfJYzd/+hNnxMRTWjGn30M=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4=\ngo.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg=\ngo.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0=\ngo.opentelemetry.io/otel/exporters/prometheus v0.43.0 h1:Skkl6akzvdWweXX6LLAY29tyFSO6hWZ26uDbVGTDXe8=\ngo.opentelemetry.io/otel/exporters/prometheus v0.43.0/go.mod h1:nZStMoc1H/YJpRjSx9IEX4abBMekORTLQcTUT1CgLkg=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.4.1/go.mod h1:BFiGsTMZdqtxufux8ANXuMeRz9dMPVFdJZadUWDFD7o=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.20.0 h1:4s9HxB4azeeQkhY0GE5wZlMj4/pz8tE5gx2OQpGUw58=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.20.0/go.mod h1:djVA3TUJ2fSdMX0JE5XxFBOaZzprElJoP7fD4vnV2SU=\ngo.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik=\ngo.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak=\ngo.opentelemetry.io/otel/sdk v1.4.1/go.mod h1:NBwHDgDIBYjwK2WNu1OPgsIc2IJzmBXNnvIJxJc8BpE=\ngo.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI=\ngo.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A=\ngo.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI=\ngo.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw=\ngo.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc=\ngo.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw=\ngo.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210415045647-66c3f260301c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8=\ngoogle.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=\ngoogle.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.4.4 h1:MX0K9Qvy0Na4o7qSC/YI7XxqUw5KDw01umqgID+svdQ=\ngorm.io/driver/mysql v1.4.4/go.mod h1:BCg8cKI+R0j/rZRQxeKis/forqRwRSYOR8OM3Wo6hOM=\ngorm.io/driver/sqlite v1.5.0 h1:zKYbzRCpBrT1bNijRnxLDJWPjVfImGEn0lSnUY5gZ+c=\ngorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I=\ngorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/plugin/opentelemetry v0.1.4 h1:7p0ocWELjSSRI7NCKPW2mVe6h43YPini99sNJcbsTuc=\ngorm.io/plugin/opentelemetry v0.1.4/go.mod h1:tndJHOdvPT0pyGhOb8E2209eXJCUxhC5UpKw7bGVWeI=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nsigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=\nsigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=\n"
  },
  {
    "path": "easy_note/hertz_gen/demoapi/api.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n// Code generated by thriftgo (0.2.7). DO NOT EDIT.\n\npackage demoapi\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n)\n\ntype BaseResp struct {\n\tStatusCode    int64  `thrift:\"status_code,1\" form:\"status_code\" json:\"status_code\" query:\"status_code\"`\n\tStatusMessage string `thrift:\"status_message,2\" form:\"status_message\" json:\"status_message\" query:\"status_message\"`\n\tServiceTime   int64  `thrift:\"service_time,3\" form:\"service_time\" json:\"service_time\" query:\"service_time\"`\n}\n\nfunc NewBaseResp() *BaseResp {\n\treturn &BaseResp{}\n}\n\nfunc (p *BaseResp) GetStatusCode() (v int64) {\n\treturn p.StatusCode\n}\n\nfunc (p *BaseResp) GetStatusMessage() (v string) {\n\treturn p.StatusMessage\n}\n\nfunc (p *BaseResp) GetServiceTime() (v int64) {\n\treturn p.ServiceTime\n}\n\nvar fieldIDToName_BaseResp = map[int16]string{\n\t1: \"status_code\",\n\t2: \"status_message\",\n\t3: \"service_time\",\n}\n\nfunc (p *BaseResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BaseResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusCode = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusMessage = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ServiceTime = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"BaseResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"status_code\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.StatusCode); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"status_message\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.StatusMessage); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"service_time\", thrift.I64, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ServiceTime); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *BaseResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BaseResp(%+v)\", *p)\n}\n\ntype User struct {\n\tUserID   int64  `thrift:\"user_id,1\" form:\"user_id\" json:\"user_id\" query:\"user_id\"`\n\tUsername string `thrift:\"username,2\" form:\"username\" json:\"username\" query:\"username\"`\n\tAvatar   string `thrift:\"avatar,3\" form:\"avatar\" json:\"avatar\" query:\"avatar\"`\n}\n\nfunc NewUser() *User {\n\treturn &User{}\n}\n\nfunc (p *User) GetUserID() (v int64) {\n\treturn p.UserID\n}\n\nfunc (p *User) GetUsername() (v string) {\n\treturn p.Username\n}\n\nfunc (p *User) GetAvatar() (v string) {\n\treturn p.Avatar\n}\n\nvar fieldIDToName_User = map[int16]string{\n\t1: \"user_id\",\n\t2: \"username\",\n\t3: \"avatar\",\n}\n\nfunc (p *User) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_User[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *User) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserID = v\n\t}\n\treturn nil\n}\n\nfunc (p *User) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Username = v\n\t}\n\treturn nil\n}\n\nfunc (p *User) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Avatar = v\n\t}\n\treturn nil\n}\n\nfunc (p *User) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"User\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *User) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *User) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"username\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Username); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *User) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"avatar\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Avatar); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *User) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"User(%+v)\", *p)\n}\n\ntype Note struct {\n\tNoteID     int64  `thrift:\"note_id,1\" form:\"note_id\" json:\"note_id\" query:\"note_id\"`\n\tUserID     int64  `thrift:\"user_id,2\" form:\"user_id\" json:\"user_id\" query:\"user_id\"`\n\tUsername   string `thrift:\"username,3\" form:\"username\" json:\"username\" query:\"username\"`\n\tUserAvatar string `thrift:\"user_avatar,4\" form:\"user_avatar\" json:\"user_avatar\" query:\"user_avatar\"`\n\tTitle      string `thrift:\"title,5\" form:\"title\" json:\"title\" query:\"title\"`\n\tContent    string `thrift:\"content,6\" form:\"content\" json:\"content\" query:\"content\"`\n\tCreateTime int64  `thrift:\"create_time,7\" form:\"create_time\" json:\"create_time\" query:\"create_time\"`\n}\n\nfunc NewNote() *Note {\n\treturn &Note{}\n}\n\nfunc (p *Note) GetNoteID() (v int64) {\n\treturn p.NoteID\n}\n\nfunc (p *Note) GetUserID() (v int64) {\n\treturn p.UserID\n}\n\nfunc (p *Note) GetUsername() (v string) {\n\treturn p.Username\n}\n\nfunc (p *Note) GetUserAvatar() (v string) {\n\treturn p.UserAvatar\n}\n\nfunc (p *Note) GetTitle() (v string) {\n\treturn p.Title\n}\n\nfunc (p *Note) GetContent() (v string) {\n\treturn p.Content\n}\n\nfunc (p *Note) GetCreateTime() (v int64) {\n\treturn p.CreateTime\n}\n\nvar fieldIDToName_Note = map[int16]string{\n\t1: \"note_id\",\n\t2: \"user_id\",\n\t3: \"username\",\n\t4: \"user_avatar\",\n\t5: \"title\",\n\t6: \"content\",\n\t7: \"create_time\",\n}\n\nfunc (p *Note) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField6(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField7(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Note[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Note) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.NoteID = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserID = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Username = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserAvatar = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Title = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Content = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.CreateTime = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Note\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField6(oprot); err != nil {\n\t\t\tfieldId = 6\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField7(oprot); err != nil {\n\t\t\tfieldId = 7\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Note) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"note_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.NoteID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Note) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *Note) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"username\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Username); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *Note) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_avatar\", thrift.STRING, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.UserAvatar); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *Note) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"title\", thrift.STRING, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Title); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *Note) writeField6(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"content\", thrift.STRING, 6); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Content); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 end error: \", p), err)\n}\n\nfunc (p *Note) writeField7(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"create_time\", thrift.I64, 7); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.CreateTime); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 end error: \", p), err)\n}\n\nfunc (p *Note) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Note(%+v)\", *p)\n}\n\ntype CreateUserRequest struct {\n\tUsername string `thrift:\"username,1\" form:\"username\" json:\"username\" vd:\"len($) > 0\"`\n\tPassword string `thrift:\"password,2\" form:\"password\" json:\"password\" vd:\"len($) > 0\"`\n}\n\nfunc NewCreateUserRequest() *CreateUserRequest {\n\treturn &CreateUserRequest{}\n}\n\nfunc (p *CreateUserRequest) GetUsername() (v string) {\n\treturn p.Username\n}\n\nfunc (p *CreateUserRequest) GetPassword() (v string) {\n\treturn p.Password\n}\n\nvar fieldIDToName_CreateUserRequest = map[int16]string{\n\t1: \"username\",\n\t2: \"password\",\n}\n\nfunc (p *CreateUserRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Username = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateUserRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Password = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateUserRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUserRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateUserRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"username\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Username); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateUserRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"password\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Password); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CreateUserRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateUserRequest(%+v)\", *p)\n}\n\ntype CreateUserResponse struct {\n\tBaseResp *BaseResp `thrift:\"base_resp,1\" form:\"base_resp\" json:\"base_resp\" query:\"base_resp\"`\n}\n\nfunc NewCreateUserResponse() *CreateUserResponse {\n\treturn &CreateUserResponse{}\n}\n\nvar CreateUserResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *CreateUserResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CreateUserResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\n\nvar fieldIDToName_CreateUserResponse = map[int16]string{\n\t1: \"base_resp\",\n}\n\nfunc (p *CreateUserResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CreateUserResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserResponse) ReadField1(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CreateUserResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUserResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateUserResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateUserResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateUserResponse(%+v)\", *p)\n}\n\ntype CheckUserRequest struct {\n\tUsername string `thrift:\"username,1\" form:\"username\" json:\"username\" vd:\"len($) > 0\"`\n\tPassword string `thrift:\"password,2\" form:\"password\" json:\"password\" vd:\"len($) > 0\"`\n}\n\nfunc NewCheckUserRequest() *CheckUserRequest {\n\treturn &CheckUserRequest{}\n}\n\nfunc (p *CheckUserRequest) GetUsername() (v string) {\n\treturn p.Username\n}\n\nfunc (p *CheckUserRequest) GetPassword() (v string) {\n\treturn p.Password\n}\n\nvar fieldIDToName_CheckUserRequest = map[int16]string{\n\t1: \"username\",\n\t2: \"password\",\n}\n\nfunc (p *CheckUserRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Username = v\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Password = v\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUserRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CheckUserRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"username\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Username); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CheckUserRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"password\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Password); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CheckUserRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CheckUserRequest(%+v)\", *p)\n}\n\ntype CheckUserResponse struct {\n\tBaseResp *BaseResp `thrift:\"base_resp,1\" form:\"base_resp\" json:\"base_resp\" query:\"base_resp\"`\n}\n\nfunc NewCheckUserResponse() *CheckUserResponse {\n\treturn &CheckUserResponse{}\n}\n\nvar CheckUserResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *CheckUserResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CheckUserResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\n\nvar fieldIDToName_CheckUserResponse = map[int16]string{\n\t1: \"base_resp\",\n}\n\nfunc (p *CheckUserResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CheckUserResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserResponse) ReadField1(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUserResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CheckUserResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CheckUserResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CheckUserResponse(%+v)\", *p)\n}\n\ntype CreateNoteRequest struct {\n\tTitle   string `thrift:\"title,1\" form:\"title\" json:\"title\" query:\"title\" vd:\"len($) > 0\"`\n\tContent string `thrift:\"content,2\" form:\"content\" json:\"content\" query:\"content\" vd:\"len($) > 0\"`\n\tUserID  int64  `thrift:\"user_id,3\" form:\"user_id\" json:\"user_id\" query:\"user_id\"`\n}\n\nfunc NewCreateNoteRequest() *CreateNoteRequest {\n\treturn &CreateNoteRequest{}\n}\n\nfunc (p *CreateNoteRequest) GetTitle() (v string) {\n\treturn p.Title\n}\n\nfunc (p *CreateNoteRequest) GetContent() (v string) {\n\treturn p.Content\n}\n\nfunc (p *CreateNoteRequest) GetUserID() (v int64) {\n\treturn p.UserID\n}\n\nvar fieldIDToName_CreateNoteRequest = map[int16]string{\n\t1: \"title\",\n\t2: \"content\",\n\t3: \"user_id\",\n}\n\nfunc (p *CreateNoteRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Title = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateNoteRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Content = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateNoteRequest) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserID = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateNoteRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateNoteRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"title\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Title); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"content\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Content); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateNoteRequest(%+v)\", *p)\n}\n\ntype CreateNoteResponse struct {\n\tBaseResp *BaseResp `thrift:\"base_resp,1\" form:\"base_resp\" json:\"base_resp\" query:\"base_resp\"`\n}\n\nfunc NewCreateNoteResponse() *CreateNoteResponse {\n\treturn &CreateNoteResponse{}\n}\n\nvar CreateNoteResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *CreateNoteResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CreateNoteResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\n\nvar fieldIDToName_CreateNoteResponse = map[int16]string{\n\t1: \"base_resp\",\n}\n\nfunc (p *CreateNoteResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CreateNoteResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteResponse) ReadField1(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CreateNoteResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateNoteResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateNoteResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateNoteResponse(%+v)\", *p)\n}\n\ntype QueryNoteRequest struct {\n\tUserID    int64   `thrift:\"user_id,1\" form:\"user_id\" json:\"user_id\" query:\"user_id\"`\n\tSearchKey *string `thrift:\"search_key,2,optional\" json:\"search_key,omitempty\" query:\"search_key\" vd:\"len($) > 0\"`\n\tOffset    int64   `thrift:\"offset,3\" json:\"offset\" query:\"offset\" vd:\"len($) >= 0\"`\n\tLimit     int64   `thrift:\"limit,4\" json:\"limit\" query:\"limit\" vd:\"len($) >= 0\"`\n}\n\nfunc NewQueryNoteRequest() *QueryNoteRequest {\n\treturn &QueryNoteRequest{}\n}\n\nfunc (p *QueryNoteRequest) GetUserID() (v int64) {\n\treturn p.UserID\n}\n\nvar QueryNoteRequest_SearchKey_DEFAULT string\n\nfunc (p *QueryNoteRequest) GetSearchKey() (v string) {\n\tif !p.IsSetSearchKey() {\n\t\treturn QueryNoteRequest_SearchKey_DEFAULT\n\t}\n\treturn *p.SearchKey\n}\n\nfunc (p *QueryNoteRequest) GetOffset() (v int64) {\n\treturn p.Offset\n}\n\nfunc (p *QueryNoteRequest) GetLimit() (v int64) {\n\treturn p.Limit\n}\n\nvar fieldIDToName_QueryNoteRequest = map[int16]string{\n\t1: \"user_id\",\n\t2: \"search_key\",\n\t3: \"offset\",\n\t4: \"limit\",\n}\n\nfunc (p *QueryNoteRequest) IsSetSearchKey() bool {\n\treturn p.SearchKey != nil\n}\n\nfunc (p *QueryNoteRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserID = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SearchKey = &v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteRequest) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Offset = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteRequest) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Limit = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryNoteRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSearchKey() {\n\t\tif err = oprot.WriteFieldBegin(\"search_key\", thrift.STRING, 2); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.SearchKey); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"offset\", thrift.I64, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Offset); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"limit\", thrift.I64, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Limit); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"QueryNoteRequest(%+v)\", *p)\n}\n\ntype QueryNoteResponse struct {\n\tNotes    []*Note   `thrift:\"notes,1\" form:\"notes\" json:\"notes\" query:\"notes\"`\n\tTotal    int64     `thrift:\"total,2\" form:\"total\" json:\"total\" query:\"total\"`\n\tBaseResp *BaseResp `thrift:\"base_resp,3\" form:\"base_resp\" json:\"base_resp\" query:\"base_resp\"`\n}\n\nfunc NewQueryNoteResponse() *QueryNoteResponse {\n\treturn &QueryNoteResponse{}\n}\n\nfunc (p *QueryNoteResponse) GetNotes() (v []*Note) {\n\treturn p.Notes\n}\n\nfunc (p *QueryNoteResponse) GetTotal() (v int64) {\n\treturn p.Total\n}\n\nvar QueryNoteResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *QueryNoteResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn QueryNoteResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\n\nvar fieldIDToName_QueryNoteResponse = map[int16]string{\n\t1: \"notes\",\n\t2: \"total\",\n\t3: \"base_resp\",\n}\n\nfunc (p *QueryNoteResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *QueryNoteResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Notes = make([]*Note, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewNote()\n\t\tif err := _elem.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.Notes = append(p.Notes, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteResponse) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Total = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteResponse) ReadField3(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryNoteResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"notes\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Notes)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Notes {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"total\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Total); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"QueryNoteResponse(%+v)\", *p)\n}\n\ntype UpdateNoteRequest struct {\n\tNoteID  int64   `thrift:\"note_id,1\" json:\"note_id\" path:\"note_id\"`\n\tUserID  int64   `thrift:\"user_id,2\" form:\"user_id\" json:\"user_id\" query:\"user_id\"`\n\tTitle   *string `thrift:\"title,3,optional\" form:\"title\" json:\"title,omitempty\" vd:\"len($) > 0\"`\n\tContent *string `thrift:\"content,4,optional\" form:\"content\" json:\"content,omitempty\" vd:\"len($) > 0\"`\n}\n\nfunc NewUpdateNoteRequest() *UpdateNoteRequest {\n\treturn &UpdateNoteRequest{}\n}\n\nfunc (p *UpdateNoteRequest) GetNoteID() (v int64) {\n\treturn p.NoteID\n}\n\nfunc (p *UpdateNoteRequest) GetUserID() (v int64) {\n\treturn p.UserID\n}\n\nvar UpdateNoteRequest_Title_DEFAULT string\n\nfunc (p *UpdateNoteRequest) GetTitle() (v string) {\n\tif !p.IsSetTitle() {\n\t\treturn UpdateNoteRequest_Title_DEFAULT\n\t}\n\treturn *p.Title\n}\n\nvar UpdateNoteRequest_Content_DEFAULT string\n\nfunc (p *UpdateNoteRequest) GetContent() (v string) {\n\tif !p.IsSetContent() {\n\t\treturn UpdateNoteRequest_Content_DEFAULT\n\t}\n\treturn *p.Content\n}\n\nvar fieldIDToName_UpdateNoteRequest = map[int16]string{\n\t1: \"note_id\",\n\t2: \"user_id\",\n\t3: \"title\",\n\t4: \"content\",\n}\n\nfunc (p *UpdateNoteRequest) IsSetTitle() bool {\n\treturn p.Title != nil\n}\n\nfunc (p *UpdateNoteRequest) IsSetContent() bool {\n\treturn p.Content != nil\n}\n\nfunc (p *UpdateNoteRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UpdateNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.NoteID = v\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserID = v\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteRequest) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Title = &v\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteRequest) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Content = &v\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UpdateNoteRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"note_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.NoteID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetTitle() {\n\t\tif err = oprot.WriteFieldBegin(\"title\", thrift.STRING, 3); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Title); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) writeField4(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetContent() {\n\t\tif err = oprot.WriteFieldBegin(\"content\", thrift.STRING, 4); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Content); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UpdateNoteRequest(%+v)\", *p)\n}\n\ntype UpdateNoteResponse struct {\n\tBaseResp *BaseResp `thrift:\"base_resp,1\" form:\"base_resp\" json:\"base_resp\" query:\"base_resp\"`\n}\n\nfunc NewUpdateNoteResponse() *UpdateNoteResponse {\n\treturn &UpdateNoteResponse{}\n}\n\nvar UpdateNoteResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *UpdateNoteResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn UpdateNoteResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\n\nvar fieldIDToName_UpdateNoteResponse = map[int16]string{\n\t1: \"base_resp\",\n}\n\nfunc (p *UpdateNoteResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *UpdateNoteResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UpdateNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteResponse) ReadField1(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UpdateNoteResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UpdateNoteResponse(%+v)\", *p)\n}\n\ntype DeleteNoteRequest struct {\n\tNoteID int64 `thrift:\"note_id,1\" json:\"note_id\" path:\"note_id\"`\n\tUserID int64 `thrift:\"user_id,2\" form:\"user_id\" json:\"user_id\" query:\"user_id\"`\n}\n\nfunc NewDeleteNoteRequest() *DeleteNoteRequest {\n\treturn &DeleteNoteRequest{}\n}\n\nfunc (p *DeleteNoteRequest) GetNoteID() (v int64) {\n\treturn p.NoteID\n}\n\nfunc (p *DeleteNoteRequest) GetUserID() (v int64) {\n\treturn p.UserID\n}\n\nvar fieldIDToName_DeleteNoteRequest = map[int16]string{\n\t1: \"note_id\",\n\t2: \"user_id\",\n}\n\nfunc (p *DeleteNoteRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.NoteID = v\n\t}\n\treturn nil\n}\n\nfunc (p *DeleteNoteRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserID = v\n\t}\n\treturn nil\n}\n\nfunc (p *DeleteNoteRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteNoteRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"note_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.NoteID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *DeleteNoteRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserID); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *DeleteNoteRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DeleteNoteRequest(%+v)\", *p)\n}\n\ntype DeleteNoteResponse struct {\n\tBaseResp *BaseResp `thrift:\"base_resp,1\" form:\"base_resp\" json:\"base_resp\" query:\"base_resp\"`\n}\n\nfunc NewDeleteNoteResponse() *DeleteNoteResponse {\n\treturn &DeleteNoteResponse{}\n}\n\nvar DeleteNoteResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *DeleteNoteResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn DeleteNoteResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\n\nvar fieldIDToName_DeleteNoteResponse = map[int16]string{\n\t1: \"base_resp\",\n}\n\nfunc (p *DeleteNoteResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *DeleteNoteResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteResponse) ReadField1(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *DeleteNoteResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteNoteResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *DeleteNoteResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DeleteNoteResponse(%+v)\", *p)\n}\n\ntype ApiService interface {\n\tCreateUser(ctx context.Context, req *CreateUserRequest) (r *CreateUserResponse, err error)\n\n\tCheckUser(ctx context.Context, req *CheckUserRequest) (r *CheckUserResponse, err error)\n\n\tCreateNote(ctx context.Context, req *CreateNoteRequest) (r *CreateNoteResponse, err error)\n\n\tQueryNote(ctx context.Context, req *QueryNoteRequest) (r *QueryNoteResponse, err error)\n\n\tUpdateNote(ctx context.Context, req *UpdateNoteRequest) (r *UpdateNoteResponse, err error)\n\n\tDeleteNote(ctx context.Context, req *DeleteNoteRequest) (r *DeleteNoteResponse, err error)\n}\n\ntype ApiServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewApiServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *ApiServiceClient {\n\treturn &ApiServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewApiServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *ApiServiceClient {\n\treturn &ApiServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewApiServiceClient(c thrift.TClient) *ApiServiceClient {\n\treturn &ApiServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *ApiServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *ApiServiceClient) CreateUser(ctx context.Context, req *CreateUserRequest) (r *CreateUserResponse, err error) {\n\tvar _args ApiServiceCreateUserArgs\n\t_args.Req = req\n\tvar _result ApiServiceCreateUserResult\n\tif err = p.Client_().Call(ctx, \"CreateUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *ApiServiceClient) CheckUser(ctx context.Context, req *CheckUserRequest) (r *CheckUserResponse, err error) {\n\tvar _args ApiServiceCheckUserArgs\n\t_args.Req = req\n\tvar _result ApiServiceCheckUserResult\n\tif err = p.Client_().Call(ctx, \"CheckUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *ApiServiceClient) CreateNote(ctx context.Context, req *CreateNoteRequest) (r *CreateNoteResponse, err error) {\n\tvar _args ApiServiceCreateNoteArgs\n\t_args.Req = req\n\tvar _result ApiServiceCreateNoteResult\n\tif err = p.Client_().Call(ctx, \"CreateNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *ApiServiceClient) QueryNote(ctx context.Context, req *QueryNoteRequest) (r *QueryNoteResponse, err error) {\n\tvar _args ApiServiceQueryNoteArgs\n\t_args.Req = req\n\tvar _result ApiServiceQueryNoteResult\n\tif err = p.Client_().Call(ctx, \"QueryNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *ApiServiceClient) UpdateNote(ctx context.Context, req *UpdateNoteRequest) (r *UpdateNoteResponse, err error) {\n\tvar _args ApiServiceUpdateNoteArgs\n\t_args.Req = req\n\tvar _result ApiServiceUpdateNoteResult\n\tif err = p.Client_().Call(ctx, \"UpdateNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *ApiServiceClient) DeleteNote(ctx context.Context, req *DeleteNoteRequest) (r *DeleteNoteResponse, err error) {\n\tvar _args ApiServiceDeleteNoteArgs\n\t_args.Req = req\n\tvar _result ApiServiceDeleteNoteResult\n\tif err = p.Client_().Call(ctx, \"DeleteNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype ApiServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      ApiService\n}\n\nfunc (p *ApiServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *ApiServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *ApiServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewApiServiceProcessor(handler ApiService) *ApiServiceProcessor {\n\tself := &ApiServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"CreateUser\", &apiServiceProcessorCreateUser{handler: handler})\n\tself.AddToProcessorMap(\"CheckUser\", &apiServiceProcessorCheckUser{handler: handler})\n\tself.AddToProcessorMap(\"CreateNote\", &apiServiceProcessorCreateNote{handler: handler})\n\tself.AddToProcessorMap(\"QueryNote\", &apiServiceProcessorQueryNote{handler: handler})\n\tself.AddToProcessorMap(\"UpdateNote\", &apiServiceProcessorUpdateNote{handler: handler})\n\tself.AddToProcessorMap(\"DeleteNote\", &apiServiceProcessorDeleteNote{handler: handler})\n\treturn self\n}\nfunc (p *ApiServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype apiServiceProcessorCreateUser struct {\n\thandler ApiService\n}\n\nfunc (p *apiServiceProcessorCreateUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ApiServiceCreateUserArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CreateUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ApiServiceCreateUserResult{}\n\tvar retval *CreateUserResponse\n\tif retval, err2 = p.handler.CreateUser(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CreateUser: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CreateUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CreateUser\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype apiServiceProcessorCheckUser struct {\n\thandler ApiService\n}\n\nfunc (p *apiServiceProcessorCheckUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ApiServiceCheckUserArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CheckUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ApiServiceCheckUserResult{}\n\tvar retval *CheckUserResponse\n\tif retval, err2 = p.handler.CheckUser(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CheckUser: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CheckUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CheckUser\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype apiServiceProcessorCreateNote struct {\n\thandler ApiService\n}\n\nfunc (p *apiServiceProcessorCreateNote) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ApiServiceCreateNoteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CreateNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ApiServiceCreateNoteResult{}\n\tvar retval *CreateNoteResponse\n\tif retval, err2 = p.handler.CreateNote(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CreateNote: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CreateNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CreateNote\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype apiServiceProcessorQueryNote struct {\n\thandler ApiService\n}\n\nfunc (p *apiServiceProcessorQueryNote) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ApiServiceQueryNoteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"QueryNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ApiServiceQueryNoteResult{}\n\tvar retval *QueryNoteResponse\n\tif retval, err2 = p.handler.QueryNote(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing QueryNote: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"QueryNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"QueryNote\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype apiServiceProcessorUpdateNote struct {\n\thandler ApiService\n}\n\nfunc (p *apiServiceProcessorUpdateNote) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ApiServiceUpdateNoteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"UpdateNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ApiServiceUpdateNoteResult{}\n\tvar retval *UpdateNoteResponse\n\tif retval, err2 = p.handler.UpdateNote(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing UpdateNote: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"UpdateNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"UpdateNote\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype apiServiceProcessorDeleteNote struct {\n\thandler ApiService\n}\n\nfunc (p *apiServiceProcessorDeleteNote) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ApiServiceDeleteNoteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"DeleteNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := ApiServiceDeleteNoteResult{}\n\tvar retval *DeleteNoteResponse\n\tif retval, err2 = p.handler.DeleteNote(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing DeleteNote: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"DeleteNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"DeleteNote\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype ApiServiceCreateUserArgs struct {\n\tReq *CreateUserRequest `thrift:\"req,1\"`\n}\n\nfunc NewApiServiceCreateUserArgs() *ApiServiceCreateUserArgs {\n\treturn &ApiServiceCreateUserArgs{}\n}\n\nvar ApiServiceCreateUserArgs_Req_DEFAULT *CreateUserRequest\n\nfunc (p *ApiServiceCreateUserArgs) GetReq() (v *CreateUserRequest) {\n\tif !p.IsSetReq() {\n\t\treturn ApiServiceCreateUserArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nvar fieldIDToName_ApiServiceCreateUserArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ApiServiceCreateUserArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ApiServiceCreateUserArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceCreateUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateUserArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCreateUserRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceCreateUserArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUser_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateUserArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateUserArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceCreateUserArgs(%+v)\", *p)\n}\n\ntype ApiServiceCreateUserResult struct {\n\tSuccess *CreateUserResponse `thrift:\"success,0,optional\"`\n}\n\nfunc NewApiServiceCreateUserResult() *ApiServiceCreateUserResult {\n\treturn &ApiServiceCreateUserResult{}\n}\n\nvar ApiServiceCreateUserResult_Success_DEFAULT *CreateUserResponse\n\nfunc (p *ApiServiceCreateUserResult) GetSuccess() (v *CreateUserResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn ApiServiceCreateUserResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nvar fieldIDToName_ApiServiceCreateUserResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ApiServiceCreateUserResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ApiServiceCreateUserResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceCreateUserResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateUserResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCreateUserResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceCreateUserResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUser_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateUserResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateUserResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceCreateUserResult(%+v)\", *p)\n}\n\ntype ApiServiceCheckUserArgs struct {\n\tReq *CheckUserRequest `thrift:\"req,1\"`\n}\n\nfunc NewApiServiceCheckUserArgs() *ApiServiceCheckUserArgs {\n\treturn &ApiServiceCheckUserArgs{}\n}\n\nvar ApiServiceCheckUserArgs_Req_DEFAULT *CheckUserRequest\n\nfunc (p *ApiServiceCheckUserArgs) GetReq() (v *CheckUserRequest) {\n\tif !p.IsSetReq() {\n\t\treturn ApiServiceCheckUserArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nvar fieldIDToName_ApiServiceCheckUserArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ApiServiceCheckUserArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ApiServiceCheckUserArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceCheckUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCheckUserArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCheckUserRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceCheckUserArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUser_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCheckUserArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ApiServiceCheckUserArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceCheckUserArgs(%+v)\", *p)\n}\n\ntype ApiServiceCheckUserResult struct {\n\tSuccess *CheckUserResponse `thrift:\"success,0,optional\"`\n}\n\nfunc NewApiServiceCheckUserResult() *ApiServiceCheckUserResult {\n\treturn &ApiServiceCheckUserResult{}\n}\n\nvar ApiServiceCheckUserResult_Success_DEFAULT *CheckUserResponse\n\nfunc (p *ApiServiceCheckUserResult) GetSuccess() (v *CheckUserResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn ApiServiceCheckUserResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nvar fieldIDToName_ApiServiceCheckUserResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ApiServiceCheckUserResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ApiServiceCheckUserResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceCheckUserResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCheckUserResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCheckUserResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceCheckUserResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUser_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCheckUserResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ApiServiceCheckUserResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceCheckUserResult(%+v)\", *p)\n}\n\ntype ApiServiceCreateNoteArgs struct {\n\tReq *CreateNoteRequest `thrift:\"req,1\"`\n}\n\nfunc NewApiServiceCreateNoteArgs() *ApiServiceCreateNoteArgs {\n\treturn &ApiServiceCreateNoteArgs{}\n}\n\nvar ApiServiceCreateNoteArgs_Req_DEFAULT *CreateNoteRequest\n\nfunc (p *ApiServiceCreateNoteArgs) GetReq() (v *CreateNoteRequest) {\n\tif !p.IsSetReq() {\n\t\treturn ApiServiceCreateNoteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nvar fieldIDToName_ApiServiceCreateNoteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ApiServiceCreateNoteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ApiServiceCreateNoteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceCreateNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateNoteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCreateNoteRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceCreateNoteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateNote_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateNoteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateNoteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceCreateNoteArgs(%+v)\", *p)\n}\n\ntype ApiServiceCreateNoteResult struct {\n\tSuccess *CreateNoteResponse `thrift:\"success,0,optional\"`\n}\n\nfunc NewApiServiceCreateNoteResult() *ApiServiceCreateNoteResult {\n\treturn &ApiServiceCreateNoteResult{}\n}\n\nvar ApiServiceCreateNoteResult_Success_DEFAULT *CreateNoteResponse\n\nfunc (p *ApiServiceCreateNoteResult) GetSuccess() (v *CreateNoteResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn ApiServiceCreateNoteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nvar fieldIDToName_ApiServiceCreateNoteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ApiServiceCreateNoteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ApiServiceCreateNoteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceCreateNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateNoteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCreateNoteResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceCreateNoteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateNote_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateNoteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ApiServiceCreateNoteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceCreateNoteResult(%+v)\", *p)\n}\n\ntype ApiServiceQueryNoteArgs struct {\n\tReq *QueryNoteRequest `thrift:\"req,1\"`\n}\n\nfunc NewApiServiceQueryNoteArgs() *ApiServiceQueryNoteArgs {\n\treturn &ApiServiceQueryNoteArgs{}\n}\n\nvar ApiServiceQueryNoteArgs_Req_DEFAULT *QueryNoteRequest\n\nfunc (p *ApiServiceQueryNoteArgs) GetReq() (v *QueryNoteRequest) {\n\tif !p.IsSetReq() {\n\t\treturn ApiServiceQueryNoteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nvar fieldIDToName_ApiServiceQueryNoteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ApiServiceQueryNoteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ApiServiceQueryNoteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceQueryNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceQueryNoteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewQueryNoteRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceQueryNoteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryNote_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceQueryNoteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ApiServiceQueryNoteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceQueryNoteArgs(%+v)\", *p)\n}\n\ntype ApiServiceQueryNoteResult struct {\n\tSuccess *QueryNoteResponse `thrift:\"success,0,optional\"`\n}\n\nfunc NewApiServiceQueryNoteResult() *ApiServiceQueryNoteResult {\n\treturn &ApiServiceQueryNoteResult{}\n}\n\nvar ApiServiceQueryNoteResult_Success_DEFAULT *QueryNoteResponse\n\nfunc (p *ApiServiceQueryNoteResult) GetSuccess() (v *QueryNoteResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn ApiServiceQueryNoteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nvar fieldIDToName_ApiServiceQueryNoteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ApiServiceQueryNoteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ApiServiceQueryNoteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceQueryNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceQueryNoteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewQueryNoteResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceQueryNoteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryNote_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceQueryNoteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ApiServiceQueryNoteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceQueryNoteResult(%+v)\", *p)\n}\n\ntype ApiServiceUpdateNoteArgs struct {\n\tReq *UpdateNoteRequest `thrift:\"req,1\"`\n}\n\nfunc NewApiServiceUpdateNoteArgs() *ApiServiceUpdateNoteArgs {\n\treturn &ApiServiceUpdateNoteArgs{}\n}\n\nvar ApiServiceUpdateNoteArgs_Req_DEFAULT *UpdateNoteRequest\n\nfunc (p *ApiServiceUpdateNoteArgs) GetReq() (v *UpdateNoteRequest) {\n\tif !p.IsSetReq() {\n\t\treturn ApiServiceUpdateNoteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nvar fieldIDToName_ApiServiceUpdateNoteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ApiServiceUpdateNoteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ApiServiceUpdateNoteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceUpdateNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceUpdateNoteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewUpdateNoteRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceUpdateNoteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UpdateNote_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceUpdateNoteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ApiServiceUpdateNoteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceUpdateNoteArgs(%+v)\", *p)\n}\n\ntype ApiServiceUpdateNoteResult struct {\n\tSuccess *UpdateNoteResponse `thrift:\"success,0,optional\"`\n}\n\nfunc NewApiServiceUpdateNoteResult() *ApiServiceUpdateNoteResult {\n\treturn &ApiServiceUpdateNoteResult{}\n}\n\nvar ApiServiceUpdateNoteResult_Success_DEFAULT *UpdateNoteResponse\n\nfunc (p *ApiServiceUpdateNoteResult) GetSuccess() (v *UpdateNoteResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn ApiServiceUpdateNoteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nvar fieldIDToName_ApiServiceUpdateNoteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ApiServiceUpdateNoteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ApiServiceUpdateNoteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceUpdateNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceUpdateNoteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewUpdateNoteResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceUpdateNoteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UpdateNote_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceUpdateNoteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ApiServiceUpdateNoteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceUpdateNoteResult(%+v)\", *p)\n}\n\ntype ApiServiceDeleteNoteArgs struct {\n\tReq *DeleteNoteRequest `thrift:\"req,1\"`\n}\n\nfunc NewApiServiceDeleteNoteArgs() *ApiServiceDeleteNoteArgs {\n\treturn &ApiServiceDeleteNoteArgs{}\n}\n\nvar ApiServiceDeleteNoteArgs_Req_DEFAULT *DeleteNoteRequest\n\nfunc (p *ApiServiceDeleteNoteArgs) GetReq() (v *DeleteNoteRequest) {\n\tif !p.IsSetReq() {\n\t\treturn ApiServiceDeleteNoteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nvar fieldIDToName_ApiServiceDeleteNoteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *ApiServiceDeleteNoteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ApiServiceDeleteNoteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceDeleteNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceDeleteNoteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewDeleteNoteRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceDeleteNoteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteNote_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceDeleteNoteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *ApiServiceDeleteNoteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceDeleteNoteArgs(%+v)\", *p)\n}\n\ntype ApiServiceDeleteNoteResult struct {\n\tSuccess *DeleteNoteResponse `thrift:\"success,0,optional\"`\n}\n\nfunc NewApiServiceDeleteNoteResult() *ApiServiceDeleteNoteResult {\n\treturn &ApiServiceDeleteNoteResult{}\n}\n\nvar ApiServiceDeleteNoteResult_Success_DEFAULT *DeleteNoteResponse\n\nfunc (p *ApiServiceDeleteNoteResult) GetSuccess() (v *DeleteNoteResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn ApiServiceDeleteNoteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nvar fieldIDToName_ApiServiceDeleteNoteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *ApiServiceDeleteNoteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ApiServiceDeleteNoteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_ApiServiceDeleteNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceDeleteNoteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewDeleteNoteResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *ApiServiceDeleteNoteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteNote_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *ApiServiceDeleteNoteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *ApiServiceDeleteNoteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ApiServiceDeleteNoteResult(%+v)\", *p)\n}\n"
  },
  {
    "path": "easy_note/idl/api.thrift",
    "content": "namespace go demoapi\n\nstruct BaseResp {\n    1: i64 status_code\n    2: string status_message\n    3: i64 service_time\n}\n\nstruct User {\n    1: i64 user_id\n    2: string username\n    3: string avatar\n}\n\nstruct Note {\n    1: i64 note_id\n    2: i64 user_id\n    3: string username\n    4: string user_avatar\n    5: string title\n    6: string content\n    7: i64 create_time\n}\n\nstruct CreateUserRequest {\n    1: string username (api.form=\"username\", api.vd=\"len($) > 0\")\n    2: string password (api.form=\"password\", api.vd=\"len($) > 0\")\n}\n\nstruct CreateUserResponse {\n    1: BaseResp base_resp\n}\n\nstruct CheckUserRequest {\n    1: string username (api.form=\"username\", api.vd=\"len($) > 0\")\n    2: string password (api.form=\"password\", api.vd=\"len($) > 0\")\n}\n\nstruct CheckUserResponse {\n    1: BaseResp base_resp\n}\n\nstruct CreateNoteRequest {\n    1: string title (api.vd=\"len($) > 0\")\n    2: string content (api.vd=\"len($) > 0\")\n    3: i64 user_id\n}\n\nstruct CreateNoteResponse {\n    1: BaseResp base_resp\n}\n\nstruct QueryNoteRequest {\n    1: i64 user_id\n    2: optional string search_key (api.query=\"search_key\", api.vd=\"len($) > 0\")\n    3: i64 offset (api.query=\"offset\", api.vd=\"len($) >= 0\")\n    4: i64 limit (api.query=\"limit\", api.vd=\"len($) >= 0\")\n}\n\nstruct QueryNoteResponse {\n    1: list<Note> notes\n    2: i64 total\n    3: BaseResp base_resp\n}\n\nstruct UpdateNoteRequest {\n    1: i64 note_id (api.path=\"note_id\")\n    2: i64 user_id\n    3: optional string title (api.form=\"title\", api.vd=\"len($) > 0\")\n    4: optional string content (api.form=\"content\", api.vd=\"len($) > 0\")\n}\n\nstruct UpdateNoteResponse {\n    1: BaseResp base_resp\n}\n\nstruct DeleteNoteRequest {\n    1: i64 note_id (api.path=\"note_id\")\n    2: i64 user_id\n}\n\nstruct DeleteNoteResponse {\n    1: BaseResp base_resp\n}\n\nservice ApiService {\n    CreateUserResponse CreateUser(1: CreateUserRequest req) (api.post=\"/v1/user/register\")\n    CheckUserResponse CheckUser(1: CheckUserRequest req) (api.post=\"/v1/user/login\")\n    CreateNoteResponse CreateNote(1: CreateNoteRequest req) (api.post=\"/v1/note\")\n    QueryNoteResponse QueryNote(1: QueryNoteRequest req) (api.get=\"/v1/note/query\")\n    UpdateNoteResponse UpdateNote(1: UpdateNoteRequest req) (api.put=\"/v1/note/:note_id\")\n    DeleteNoteResponse DeleteNote(1: DeleteNoteRequest req) (api.delete=\"/v1/note/:note_id\")\n}"
  },
  {
    "path": "easy_note/idl/note.thrift",
    "content": "namespace go demonote\n\nstruct BaseResp {\n    1: i64 status_code\n    2: string status_message\n    3: i64 service_time\n}\n\nstruct Note {\n    1: i64 note_id\n    2: i64 user_id\n    3: string username\n    4: string user_avatar\n    5: string title\n    6: string content\n    7: i64 create_time\n}\n\nstruct CreateNoteRequest {\n    1: string title (vt.min_size = \"1\")\n    2: string content (vt.min_size = \"1\")\n    3: i64 user_id (vt.gt = \"0\")\n}\n\nstruct CreateNoteResponse {\n    1: BaseResp base_resp\n}\n\nstruct DeleteNoteRequest {\n    1: i64 note_id (vt.gt = \"0\")\n    2: i64 user_id\n}\n\nstruct DeleteNoteResponse {\n    1: BaseResp base_resp\n}\n\nstruct UpdateNoteRequest {\n    1: i64 note_id (vt.gt = \"0\")\n    2: i64 user_id\n    3: optional string title\n    4: optional string content\n}\n\nstruct UpdateNoteResponse {\n    1: BaseResp base_resp\n}\n\nstruct QueryNoteRequest {\n    1: i64 user_id (vt.gt = \"0\")\n    2: optional string search_key\n    3: i64 offset (vt.ge = \"0\")\n    4: i64 limit (vt.ge = \"0\")\n}\n\nstruct QueryNoteResponse {\n    1: list<Note> notes\n    2: i64 total\n    3: BaseResp base_resp\n}\n\nstruct MGetNoteRequest {\n    1: list<i64> note_ids (vt.min_size = \"1\")\n}\n\nstruct MGetNoteResponse {\n    1: list<Note> notes\n    2: BaseResp base_resp\n}\n\nservice NoteService {\n    CreateNoteResponse CreateNote(1: CreateNoteRequest req)\n    DeleteNoteResponse DeleteNote(1: DeleteNoteRequest req)\n    UpdateNoteResponse UpdateNote(1: UpdateNoteRequest req)\n    QueryNoteResponse QueryNote(1: QueryNoteRequest req)\n    MGetNoteResponse MGetNote(1: MGetNoteRequest req)\n}\n"
  },
  {
    "path": "easy_note/idl/user.thrift",
    "content": "namespace go demouser\n\nenum ErrCode {\n    SuccessCode                = 0\n    ServiceErrCode             = 10001\n    ParamErrCode               = 10002\n    UserAlreadyExistErrCode    = 10003\n    AuthorizationFailedErrCode = 10004\n}\n\nstruct BaseResp {\n    1: i64 status_code\n    2: string status_message\n    3: i64 service_time\n}\n\nstruct User {\n    1: i64 user_id\n    2: string username\n    3: string avatar\n}\n\nstruct CreateUserRequest {\n    1: string username (vt.min_size = \"1\")\n    2: string password (vt.min_size = \"1\")\n}\n\nstruct CreateUserResponse {\n    1: BaseResp base_resp\n}\n\nstruct MGetUserRequest {\n    1: list<i64> user_ids (vt.min_size = \"1\")\n}\n\nstruct MGetUserResponse {\n    1: list<User> users\n    2: BaseResp base_resp\n}\n\nstruct CheckUserRequest {\n    1: string username (vt.min_size = \"1\")\n    2: string password (vt.min_size = \"1\")\n}\n\nstruct CheckUserResponse {\n    1: i64 user_id\n    2: BaseResp base_resp\n}\n\nservice UserService {\n    CreateUserResponse CreateUser(1: CreateUserRequest req)\n    MGetUserResponse MGetUser(1: MGetUserRequest req)\n    CheckUserResponse CheckUser(1: CheckUserRequest req)\n}"
  },
  {
    "path": "easy_note/kitex_gen/demonote/k-consts.go",
    "content": "package demonote\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "easy_note/kitex_gen/demonote/k-note.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage demonote\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *BaseResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BaseResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StatusCode = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BaseResp) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StatusMessage = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BaseResp) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ServiceTime = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *BaseResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *BaseResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"BaseResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"BaseResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"status_code\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.StatusCode)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"status_message\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.StatusMessage)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"service_time\", thrift.I64, 3)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ServiceTime)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"status_code\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.StatusCode)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"status_message\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.StatusMessage)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"service_time\", thrift.I64, 3)\n\tl += bthrift.Binary.I64Length(p.ServiceTime)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Note) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField6(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField7(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Note[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Note) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.NoteId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Note) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Note) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Username = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Note) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserAvatar = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Note) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Title = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Note) FastReadField6(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Content = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *Note) FastReadField7(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.CreateTime = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Note) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Note) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Note\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField7(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField6(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Note) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Note\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t\tl += p.field6Length()\n\t\tl += p.field7Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Note) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"note_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.NoteId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Note) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 2)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Note) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"username\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Username)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Note) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_avatar\", thrift.STRING, 4)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.UserAvatar)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Note) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"title\", thrift.STRING, 5)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Title)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Note) fastWriteField6(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"content\", thrift.STRING, 6)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Content)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Note) fastWriteField7(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"create_time\", thrift.I64, 7)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.CreateTime)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Note) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"note_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.NoteId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Note) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 2)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Note) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"username\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.Username)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Note) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_avatar\", thrift.STRING, 4)\n\tl += bthrift.Binary.StringLengthNocopy(p.UserAvatar)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Note) field5Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"title\", thrift.STRING, 5)\n\tl += bthrift.Binary.StringLengthNocopy(p.Title)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Note) field6Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"content\", thrift.STRING, 6)\n\tl += bthrift.Binary.StringLengthNocopy(p.Content)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Note) field7Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"create_time\", thrift.I64, 7)\n\tl += bthrift.Binary.I64Length(p.CreateTime)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateNoteRequest) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Title = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CreateNoteRequest) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Content = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CreateNoteRequest) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CreateNoteRequest) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CreateNoteRequest) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateNoteRequest\")\n\tif p != nil {\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateNoteRequest) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateNoteRequest\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CreateNoteRequest) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"title\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Title)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateNoteRequest) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"content\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Content)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateNoteRequest) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 3)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateNoteRequest) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"title\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Title)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateNoteRequest) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"content\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Content)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateNoteRequest) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 3)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateNoteResponse) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteResponse) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CreateNoteResponse) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CreateNoteResponse) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateNoteResponse\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateNoteResponse) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateNoteResponse\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CreateNoteResponse) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"base_resp\", thrift.STRUCT, 1)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateNoteResponse) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"base_resp\", thrift.STRUCT, 1)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DeleteNoteRequest) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteRequest) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.NoteId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *DeleteNoteRequest) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *DeleteNoteRequest) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *DeleteNoteRequest) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DeleteNoteRequest\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DeleteNoteRequest) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DeleteNoteRequest\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *DeleteNoteRequest) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"note_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.NoteId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DeleteNoteRequest) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 2)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DeleteNoteRequest) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"note_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.NoteId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DeleteNoteRequest) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 2)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *DeleteNoteResponse) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteResponse) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *DeleteNoteResponse) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *DeleteNoteResponse) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DeleteNoteResponse\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DeleteNoteResponse) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DeleteNoteResponse\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *DeleteNoteResponse) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"base_resp\", thrift.STRUCT, 1)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *DeleteNoteResponse) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"base_resp\", thrift.STRUCT, 1)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UpdateNoteRequest) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UpdateNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.NoteId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UpdateNoteRequest) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UpdateNoteRequest) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Title = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UpdateNoteRequest) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.Content = &v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UpdateNoteRequest) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UpdateNoteRequest) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"UpdateNoteRequest\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UpdateNoteRequest) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"UpdateNoteRequest\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UpdateNoteRequest) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"note_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.NoteId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UpdateNoteRequest) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 2)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UpdateNoteRequest) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetTitle() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"title\", thrift.STRING, 3)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.Title)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *UpdateNoteRequest) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetContent() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"content\", thrift.STRING, 4)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.Content)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *UpdateNoteRequest) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"note_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.NoteId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UpdateNoteRequest) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 2)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UpdateNoteRequest) field3Length() int {\n\tl := 0\n\tif p.IsSetTitle() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"title\", thrift.STRING, 3)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.Title)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *UpdateNoteRequest) field4Length() int {\n\tl := 0\n\tif p.IsSetContent() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"content\", thrift.STRING, 4)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.Content)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *UpdateNoteResponse) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UpdateNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteResponse) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UpdateNoteResponse) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UpdateNoteResponse) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"UpdateNoteResponse\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UpdateNoteResponse) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"UpdateNoteResponse\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UpdateNoteResponse) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"base_resp\", thrift.STRUCT, 1)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UpdateNoteResponse) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"base_resp\", thrift.STRUCT, 1)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QueryNoteRequest) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QueryNoteRequest) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t\tp.SearchKey = &v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QueryNoteRequest) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Offset = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QueryNoteRequest) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Limit = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *QueryNoteRequest) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *QueryNoteRequest) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QueryNoteRequest\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryNoteRequest) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QueryNoteRequest\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *QueryNoteRequest) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryNoteRequest) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSearchKey() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"search_key\", thrift.STRING, 2)\n\t\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, *p.SearchKey)\n\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *QueryNoteRequest) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"offset\", thrift.I64, 3)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.Offset)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryNoteRequest) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"limit\", thrift.I64, 4)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.Limit)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryNoteRequest) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QueryNoteRequest) field2Length() int {\n\tl := 0\n\tif p.IsSetSearchKey() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"search_key\", thrift.STRING, 2)\n\t\tl += bthrift.Binary.StringLengthNocopy(*p.SearchKey)\n\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *QueryNoteRequest) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"offset\", thrift.I64, 3)\n\tl += bthrift.Binary.I64Length(p.Offset)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QueryNoteRequest) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"limit\", thrift.I64, 4)\n\tl += bthrift.Binary.I64Length(p.Limit)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QueryNoteResponse) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Notes = make([]*Note, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewNote()\n\t\tif l, err := _elem.FastRead(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\t\t}\n\n\t\tp.Notes = append(p.Notes, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QueryNoteResponse) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Total = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QueryNoteResponse) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *QueryNoteResponse) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *QueryNoteResponse) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QueryNoteResponse\")\n\tif p != nil {\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryNoteResponse) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QueryNoteResponse\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *QueryNoteResponse) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"notes\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.STRUCT, 0)\n\tvar length int\n\tfor _, v := range p.Notes {\n\t\tlength++\n\t\toffset += v.FastWriteNocopy(buf[offset:], binaryWriter)\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.STRUCT, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryNoteResponse) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"total\", thrift.I64, 2)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.Total)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryNoteResponse) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"base_resp\", thrift.STRUCT, 3)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryNoteResponse) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"notes\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.STRUCT, len(p.Notes))\n\tfor _, v := range p.Notes {\n\t\tl += v.BLength()\n\t}\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QueryNoteResponse) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"total\", thrift.I64, 2)\n\tl += bthrift.Binary.I64Length(p.Total)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QueryNoteResponse) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"base_resp\", thrift.STRUCT, 3)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGetNoteRequest) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetNoteRequest) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.NoteIds = make([]int64, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _elem int64\n\t\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\n\t\t\t_elem = v\n\n\t\t}\n\n\t\tp.NoteIds = append(p.NoteIds, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *MGetNoteRequest) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *MGetNoteRequest) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetNoteRequest\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetNoteRequest) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetNoteRequest\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *MGetNoteRequest) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"note_ids\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.I64, 0)\n\tvar length int\n\tfor _, v := range p.NoteIds {\n\t\tlength++\n\t\toffset += bthrift.Binary.WriteI64(buf[offset:], v)\n\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.I64, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetNoteRequest) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"note_ids\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.I64, len(p.NoteIds))\n\tvar tmpV int64\n\tl += bthrift.Binary.I64Length(int64(tmpV)) * len(p.NoteIds)\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGetNoteResponse) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetNoteResponse) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Notes = make([]*Note, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewNote()\n\t\tif l, err := _elem.FastRead(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\t\t}\n\n\t\tp.Notes = append(p.Notes, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\nfunc (p *MGetNoteResponse) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *MGetNoteResponse) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *MGetNoteResponse) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetNoteResponse\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetNoteResponse) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetNoteResponse\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *MGetNoteResponse) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"notes\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.STRUCT, 0)\n\tvar length int\n\tfor _, v := range p.Notes {\n\t\tlength++\n\t\toffset += v.FastWriteNocopy(buf[offset:], binaryWriter)\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.STRUCT, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetNoteResponse) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"base_resp\", thrift.STRUCT, 2)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetNoteResponse) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"notes\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.STRUCT, len(p.Notes))\n\tfor _, v := range p.Notes {\n\t\tl += v.BLength()\n\t}\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGetNoteResponse) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"base_resp\", thrift.STRUCT, 2)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceCreateNoteArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceCreateNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceCreateNoteArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCreateNoteRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceCreateNoteArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceCreateNoteArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateNote_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceCreateNoteArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateNote_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceCreateNoteArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceCreateNoteArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceCreateNoteResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceCreateNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceCreateNoteResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCreateNoteResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceCreateNoteResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceCreateNoteResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateNote_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceCreateNoteResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateNote_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceCreateNoteResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *NoteServiceCreateNoteResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceDeleteNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewDeleteNoteRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceDeleteNoteArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DeleteNote_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DeleteNote_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceDeleteNoteResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceDeleteNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceDeleteNoteResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewDeleteNoteResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceDeleteNoteResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceDeleteNoteResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"DeleteNote_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceDeleteNoteResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"DeleteNote_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceDeleteNoteResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *NoteServiceDeleteNoteResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceUpdateNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewUpdateNoteRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceUpdateNoteArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"UpdateNote_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"UpdateNote_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceUpdateNoteResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceUpdateNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceUpdateNoteResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewUpdateNoteResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceUpdateNoteResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceUpdateNoteResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"UpdateNote_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceUpdateNoteResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"UpdateNote_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceUpdateNoteResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *NoteServiceUpdateNoteResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *NoteServiceQueryNoteArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceQueryNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceQueryNoteArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewQueryNoteRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceQueryNoteArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceQueryNoteArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QueryNote_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceQueryNoteArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QueryNote_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceQueryNoteArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceQueryNoteArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceQueryNoteResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceQueryNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceQueryNoteResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewQueryNoteResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceQueryNoteResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceQueryNoteResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QueryNote_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceQueryNoteResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QueryNote_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceQueryNoteResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *NoteServiceQueryNoteResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *NoteServiceMGetNoteArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceMGetNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceMGetNoteArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewMGetNoteRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceMGetNoteArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceMGetNoteArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetNote_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceMGetNoteArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetNote_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceMGetNoteArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceMGetNoteArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceMGetNoteResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceMGetNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceMGetNoteResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewMGetNoteResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *NoteServiceMGetNoteResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *NoteServiceMGetNoteResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetNote_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *NoteServiceMGetNoteResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetNote_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *NoteServiceMGetNoteResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *NoteServiceMGetNoteResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *NoteServiceCreateNoteArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *NoteServiceCreateNoteResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *NoteServiceDeleteNoteResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *NoteServiceUpdateNoteResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *NoteServiceQueryNoteArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *NoteServiceQueryNoteResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *NoteServiceMGetNoteArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *NoteServiceMGetNoteResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demonote/note.go",
    "content": "// Code generated by thriftgo (0.2.3). DO NOT EDIT.\n\npackage demonote\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype BaseResp struct {\n\tStatusCode    int64  `thrift:\"status_code,1\" json:\"status_code\"`\n\tStatusMessage string `thrift:\"status_message,2\" json:\"status_message\"`\n\tServiceTime   int64  `thrift:\"service_time,3\" json:\"service_time\"`\n}\n\nfunc NewBaseResp() *BaseResp {\n\treturn &BaseResp{}\n}\n\nfunc (p *BaseResp) GetStatusCode() (v int64) {\n\treturn p.StatusCode\n}\n\nfunc (p *BaseResp) GetStatusMessage() (v string) {\n\treturn p.StatusMessage\n}\n\nfunc (p *BaseResp) GetServiceTime() (v int64) {\n\treturn p.ServiceTime\n}\nfunc (p *BaseResp) SetStatusCode(val int64) {\n\tp.StatusCode = val\n}\nfunc (p *BaseResp) SetStatusMessage(val string) {\n\tp.StatusMessage = val\n}\nfunc (p *BaseResp) SetServiceTime(val int64) {\n\tp.ServiceTime = val\n}\n\nvar fieldIDToName_BaseResp = map[int16]string{\n\t1: \"status_code\",\n\t2: \"status_message\",\n\t3: \"service_time\",\n}\n\nfunc (p *BaseResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BaseResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusCode = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusMessage = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ServiceTime = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"BaseResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"status_code\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.StatusCode); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"status_message\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.StatusMessage); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"service_time\", thrift.I64, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ServiceTime); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *BaseResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BaseResp(%+v)\", *p)\n}\n\nfunc (p *BaseResp) DeepEqual(ano *BaseResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.StatusCode) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.StatusMessage) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.ServiceTime) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *BaseResp) Field1DeepEqual(src int64) bool {\n\n\tif p.StatusCode != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BaseResp) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.StatusMessage, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BaseResp) Field3DeepEqual(src int64) bool {\n\n\tif p.ServiceTime != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Note struct {\n\tNoteId     int64  `thrift:\"note_id,1\" json:\"note_id\"`\n\tUserId     int64  `thrift:\"user_id,2\" json:\"user_id\"`\n\tUsername   string `thrift:\"username,3\" json:\"username\"`\n\tUserAvatar string `thrift:\"user_avatar,4\" json:\"user_avatar\"`\n\tTitle      string `thrift:\"title,5\" json:\"title\"`\n\tContent    string `thrift:\"content,6\" json:\"content\"`\n\tCreateTime int64  `thrift:\"create_time,7\" json:\"create_time\"`\n}\n\nfunc NewNote() *Note {\n\treturn &Note{}\n}\n\nfunc (p *Note) GetNoteId() (v int64) {\n\treturn p.NoteId\n}\n\nfunc (p *Note) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nfunc (p *Note) GetUsername() (v string) {\n\treturn p.Username\n}\n\nfunc (p *Note) GetUserAvatar() (v string) {\n\treturn p.UserAvatar\n}\n\nfunc (p *Note) GetTitle() (v string) {\n\treturn p.Title\n}\n\nfunc (p *Note) GetContent() (v string) {\n\treturn p.Content\n}\n\nfunc (p *Note) GetCreateTime() (v int64) {\n\treturn p.CreateTime\n}\nfunc (p *Note) SetNoteId(val int64) {\n\tp.NoteId = val\n}\nfunc (p *Note) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *Note) SetUsername(val string) {\n\tp.Username = val\n}\nfunc (p *Note) SetUserAvatar(val string) {\n\tp.UserAvatar = val\n}\nfunc (p *Note) SetTitle(val string) {\n\tp.Title = val\n}\nfunc (p *Note) SetContent(val string) {\n\tp.Content = val\n}\nfunc (p *Note) SetCreateTime(val int64) {\n\tp.CreateTime = val\n}\n\nvar fieldIDToName_Note = map[int16]string{\n\t1: \"note_id\",\n\t2: \"user_id\",\n\t3: \"username\",\n\t4: \"user_avatar\",\n\t5: \"title\",\n\t6: \"content\",\n\t7: \"create_time\",\n}\n\nfunc (p *Note) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField6(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField7(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Note[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Note) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.NoteId = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Username = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserAvatar = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Title = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Content = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) ReadField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.CreateTime = v\n\t}\n\treturn nil\n}\n\nfunc (p *Note) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Note\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField6(oprot); err != nil {\n\t\t\tfieldId = 6\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField7(oprot); err != nil {\n\t\t\tfieldId = 7\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Note) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"note_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.NoteId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Note) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *Note) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"username\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Username); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *Note) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_avatar\", thrift.STRING, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.UserAvatar); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *Note) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"title\", thrift.STRING, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Title); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *Note) writeField6(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"content\", thrift.STRING, 6); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Content); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 end error: \", p), err)\n}\n\nfunc (p *Note) writeField7(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"create_time\", thrift.I64, 7); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.CreateTime); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 end error: \", p), err)\n}\n\nfunc (p *Note) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Note(%+v)\", *p)\n}\n\nfunc (p *Note) DeepEqual(ano *Note) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.NoteId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Username) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.UserAvatar) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.Title) {\n\t\treturn false\n\t}\n\tif !p.Field6DeepEqual(ano.Content) {\n\t\treturn false\n\t}\n\tif !p.Field7DeepEqual(ano.CreateTime) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Note) Field1DeepEqual(src int64) bool {\n\n\tif p.NoteId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Note) Field2DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Note) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Username, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Note) Field4DeepEqual(src string) bool {\n\n\tif strings.Compare(p.UserAvatar, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Note) Field5DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Title, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Note) Field6DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Content, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *Note) Field7DeepEqual(src int64) bool {\n\n\tif p.CreateTime != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CreateNoteRequest struct {\n\tTitle   string `thrift:\"title,1\" json:\"title\"`\n\tContent string `thrift:\"content,2\" json:\"content\"`\n\tUserId  int64  `thrift:\"user_id,3\" json:\"user_id\"`\n}\n\nfunc NewCreateNoteRequest() *CreateNoteRequest {\n\treturn &CreateNoteRequest{}\n}\n\nfunc (p *CreateNoteRequest) GetTitle() (v string) {\n\treturn p.Title\n}\n\nfunc (p *CreateNoteRequest) GetContent() (v string) {\n\treturn p.Content\n}\n\nfunc (p *CreateNoteRequest) GetUserId() (v int64) {\n\treturn p.UserId\n}\nfunc (p *CreateNoteRequest) SetTitle(val string) {\n\tp.Title = val\n}\nfunc (p *CreateNoteRequest) SetContent(val string) {\n\tp.Content = val\n}\nfunc (p *CreateNoteRequest) SetUserId(val int64) {\n\tp.UserId = val\n}\n\nvar fieldIDToName_CreateNoteRequest = map[int16]string{\n\t1: \"title\",\n\t2: \"content\",\n\t3: \"user_id\",\n}\n\nfunc (p *CreateNoteRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Title = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateNoteRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Content = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateNoteRequest) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateNoteRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateNoteRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"title\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Title); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"content\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Content); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *CreateNoteRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateNoteRequest(%+v)\", *p)\n}\n\nfunc (p *CreateNoteRequest) DeepEqual(ano *CreateNoteRequest) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Title) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Content) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CreateNoteRequest) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Title, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CreateNoteRequest) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Content, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CreateNoteRequest) Field3DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CreateNoteResponse struct {\n\tBaseResp *BaseResp `thrift:\"base_resp,1\" json:\"base_resp\"`\n}\n\nfunc NewCreateNoteResponse() *CreateNoteResponse {\n\treturn &CreateNoteResponse{}\n}\n\nvar CreateNoteResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *CreateNoteResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CreateNoteResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *CreateNoteResponse) SetBaseResp(val *BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_CreateNoteResponse = map[int16]string{\n\t1: \"base_resp\",\n}\n\nfunc (p *CreateNoteResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CreateNoteResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteResponse) ReadField1(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CreateNoteResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateNoteResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateNoteResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateNoteResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateNoteResponse(%+v)\", *p)\n}\n\nfunc (p *CreateNoteResponse) DeepEqual(ano *CreateNoteResponse) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CreateNoteResponse) Field1DeepEqual(src *BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype DeleteNoteRequest struct {\n\tNoteId int64 `thrift:\"note_id,1\" json:\"note_id\"`\n\tUserId int64 `thrift:\"user_id,2\" json:\"user_id\"`\n}\n\nfunc NewDeleteNoteRequest() *DeleteNoteRequest {\n\treturn &DeleteNoteRequest{}\n}\n\nfunc (p *DeleteNoteRequest) GetNoteId() (v int64) {\n\treturn p.NoteId\n}\n\nfunc (p *DeleteNoteRequest) GetUserId() (v int64) {\n\treturn p.UserId\n}\nfunc (p *DeleteNoteRequest) SetNoteId(val int64) {\n\tp.NoteId = val\n}\nfunc (p *DeleteNoteRequest) SetUserId(val int64) {\n\tp.UserId = val\n}\n\nvar fieldIDToName_DeleteNoteRequest = map[int16]string{\n\t1: \"note_id\",\n\t2: \"user_id\",\n}\n\nfunc (p *DeleteNoteRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.NoteId = v\n\t}\n\treturn nil\n}\n\nfunc (p *DeleteNoteRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *DeleteNoteRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteNoteRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"note_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.NoteId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *DeleteNoteRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *DeleteNoteRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DeleteNoteRequest(%+v)\", *p)\n}\n\nfunc (p *DeleteNoteRequest) DeepEqual(ano *DeleteNoteRequest) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.NoteId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *DeleteNoteRequest) Field1DeepEqual(src int64) bool {\n\n\tif p.NoteId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *DeleteNoteRequest) Field2DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype DeleteNoteResponse struct {\n\tBaseResp *BaseResp `thrift:\"base_resp,1\" json:\"base_resp\"`\n}\n\nfunc NewDeleteNoteResponse() *DeleteNoteResponse {\n\treturn &DeleteNoteResponse{}\n}\n\nvar DeleteNoteResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *DeleteNoteResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn DeleteNoteResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *DeleteNoteResponse) SetBaseResp(val *BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_DeleteNoteResponse = map[int16]string{\n\t1: \"base_resp\",\n}\n\nfunc (p *DeleteNoteResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *DeleteNoteResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_DeleteNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteResponse) ReadField1(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *DeleteNoteResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteNoteResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *DeleteNoteResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *DeleteNoteResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"DeleteNoteResponse(%+v)\", *p)\n}\n\nfunc (p *DeleteNoteResponse) DeepEqual(ano *DeleteNoteResponse) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *DeleteNoteResponse) Field1DeepEqual(src *BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UpdateNoteRequest struct {\n\tNoteId  int64   `thrift:\"note_id,1\" json:\"note_id\"`\n\tUserId  int64   `thrift:\"user_id,2\" json:\"user_id\"`\n\tTitle   *string `thrift:\"title,3,optional\" json:\"title,omitempty\"`\n\tContent *string `thrift:\"content,4,optional\" json:\"content,omitempty\"`\n}\n\nfunc NewUpdateNoteRequest() *UpdateNoteRequest {\n\treturn &UpdateNoteRequest{}\n}\n\nfunc (p *UpdateNoteRequest) GetNoteId() (v int64) {\n\treturn p.NoteId\n}\n\nfunc (p *UpdateNoteRequest) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nvar UpdateNoteRequest_Title_DEFAULT string\n\nfunc (p *UpdateNoteRequest) GetTitle() (v string) {\n\tif !p.IsSetTitle() {\n\t\treturn UpdateNoteRequest_Title_DEFAULT\n\t}\n\treturn *p.Title\n}\n\nvar UpdateNoteRequest_Content_DEFAULT string\n\nfunc (p *UpdateNoteRequest) GetContent() (v string) {\n\tif !p.IsSetContent() {\n\t\treturn UpdateNoteRequest_Content_DEFAULT\n\t}\n\treturn *p.Content\n}\nfunc (p *UpdateNoteRequest) SetNoteId(val int64) {\n\tp.NoteId = val\n}\nfunc (p *UpdateNoteRequest) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *UpdateNoteRequest) SetTitle(val *string) {\n\tp.Title = val\n}\nfunc (p *UpdateNoteRequest) SetContent(val *string) {\n\tp.Content = val\n}\n\nvar fieldIDToName_UpdateNoteRequest = map[int16]string{\n\t1: \"note_id\",\n\t2: \"user_id\",\n\t3: \"title\",\n\t4: \"content\",\n}\n\nfunc (p *UpdateNoteRequest) IsSetTitle() bool {\n\treturn p.Title != nil\n}\n\nfunc (p *UpdateNoteRequest) IsSetContent() bool {\n\treturn p.Content != nil\n}\n\nfunc (p *UpdateNoteRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UpdateNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.NoteId = v\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteRequest) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Title = &v\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteRequest) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Content = &v\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UpdateNoteRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"note_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.NoteId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetTitle() {\n\t\tif err = oprot.WriteFieldBegin(\"title\", thrift.STRING, 3); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Title); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) writeField4(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetContent() {\n\t\tif err = oprot.WriteFieldBegin(\"content\", thrift.STRING, 4); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.Content); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UpdateNoteRequest(%+v)\", *p)\n}\n\nfunc (p *UpdateNoteRequest) DeepEqual(ano *UpdateNoteRequest) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.NoteId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Title) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.Content) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UpdateNoteRequest) Field1DeepEqual(src int64) bool {\n\n\tif p.NoteId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UpdateNoteRequest) Field2DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UpdateNoteRequest) Field3DeepEqual(src *string) bool {\n\n\tif p.Title == src {\n\t\treturn true\n\t} else if p.Title == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.Title, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UpdateNoteRequest) Field4DeepEqual(src *string) bool {\n\n\tif p.Content == src {\n\t\treturn true\n\t} else if p.Content == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.Content, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UpdateNoteResponse struct {\n\tBaseResp *BaseResp `thrift:\"base_resp,1\" json:\"base_resp\"`\n}\n\nfunc NewUpdateNoteResponse() *UpdateNoteResponse {\n\treturn &UpdateNoteResponse{}\n}\n\nvar UpdateNoteResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *UpdateNoteResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn UpdateNoteResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *UpdateNoteResponse) SetBaseResp(val *BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_UpdateNoteResponse = map[int16]string{\n\t1: \"base_resp\",\n}\n\nfunc (p *UpdateNoteResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *UpdateNoteResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UpdateNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteResponse) ReadField1(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UpdateNoteResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UpdateNoteResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UpdateNoteResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UpdateNoteResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UpdateNoteResponse(%+v)\", *p)\n}\n\nfunc (p *UpdateNoteResponse) DeepEqual(ano *UpdateNoteResponse) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UpdateNoteResponse) Field1DeepEqual(src *BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype QueryNoteRequest struct {\n\tUserId    int64   `thrift:\"user_id,1\" json:\"user_id\"`\n\tSearchKey *string `thrift:\"search_key,2,optional\" json:\"search_key,omitempty\"`\n\tOffset    int64   `thrift:\"offset,3\" json:\"offset\"`\n\tLimit     int64   `thrift:\"limit,4\" json:\"limit\"`\n}\n\nfunc NewQueryNoteRequest() *QueryNoteRequest {\n\treturn &QueryNoteRequest{}\n}\n\nfunc (p *QueryNoteRequest) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nvar QueryNoteRequest_SearchKey_DEFAULT string\n\nfunc (p *QueryNoteRequest) GetSearchKey() (v string) {\n\tif !p.IsSetSearchKey() {\n\t\treturn QueryNoteRequest_SearchKey_DEFAULT\n\t}\n\treturn *p.SearchKey\n}\n\nfunc (p *QueryNoteRequest) GetOffset() (v int64) {\n\treturn p.Offset\n}\n\nfunc (p *QueryNoteRequest) GetLimit() (v int64) {\n\treturn p.Limit\n}\nfunc (p *QueryNoteRequest) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *QueryNoteRequest) SetSearchKey(val *string) {\n\tp.SearchKey = val\n}\nfunc (p *QueryNoteRequest) SetOffset(val int64) {\n\tp.Offset = val\n}\nfunc (p *QueryNoteRequest) SetLimit(val int64) {\n\tp.Limit = val\n}\n\nvar fieldIDToName_QueryNoteRequest = map[int16]string{\n\t1: \"user_id\",\n\t2: \"search_key\",\n\t3: \"offset\",\n\t4: \"limit\",\n}\n\nfunc (p *QueryNoteRequest) IsSetSearchKey() bool {\n\treturn p.SearchKey != nil\n}\n\nfunc (p *QueryNoteRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SearchKey = &v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteRequest) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Offset = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteRequest) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Limit = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryNoteRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSearchKey() {\n\t\tif err = oprot.WriteFieldBegin(\"search_key\", thrift.STRING, 2); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := oprot.WriteString(*p.SearchKey); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"offset\", thrift.I64, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Offset); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"limit\", thrift.I64, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Limit); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *QueryNoteRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"QueryNoteRequest(%+v)\", *p)\n}\n\nfunc (p *QueryNoteRequest) DeepEqual(ano *QueryNoteRequest) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.SearchKey) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Offset) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.Limit) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *QueryNoteRequest) Field1DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QueryNoteRequest) Field2DeepEqual(src *string) bool {\n\n\tif p.SearchKey == src {\n\t\treturn true\n\t} else if p.SearchKey == nil || src == nil {\n\t\treturn false\n\t}\n\tif strings.Compare(*p.SearchKey, *src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QueryNoteRequest) Field3DeepEqual(src int64) bool {\n\n\tif p.Offset != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QueryNoteRequest) Field4DeepEqual(src int64) bool {\n\n\tif p.Limit != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype QueryNoteResponse struct {\n\tNotes    []*Note   `thrift:\"notes,1\" json:\"notes\"`\n\tTotal    int64     `thrift:\"total,2\" json:\"total\"`\n\tBaseResp *BaseResp `thrift:\"base_resp,3\" json:\"base_resp\"`\n}\n\nfunc NewQueryNoteResponse() *QueryNoteResponse {\n\treturn &QueryNoteResponse{}\n}\n\nfunc (p *QueryNoteResponse) GetNotes() (v []*Note) {\n\treturn p.Notes\n}\n\nfunc (p *QueryNoteResponse) GetTotal() (v int64) {\n\treturn p.Total\n}\n\nvar QueryNoteResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *QueryNoteResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn QueryNoteResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *QueryNoteResponse) SetNotes(val []*Note) {\n\tp.Notes = val\n}\nfunc (p *QueryNoteResponse) SetTotal(val int64) {\n\tp.Total = val\n}\nfunc (p *QueryNoteResponse) SetBaseResp(val *BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_QueryNoteResponse = map[int16]string{\n\t1: \"notes\",\n\t2: \"total\",\n\t3: \"base_resp\",\n}\n\nfunc (p *QueryNoteResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *QueryNoteResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Notes = make([]*Note, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewNote()\n\t\tif err := _elem.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.Notes = append(p.Notes, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteResponse) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Total = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteResponse) ReadField3(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *QueryNoteResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryNoteResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"notes\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Notes)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Notes {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"total\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.Total); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *QueryNoteResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"QueryNoteResponse(%+v)\", *p)\n}\n\nfunc (p *QueryNoteResponse) DeepEqual(ano *QueryNoteResponse) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Notes) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Total) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *QueryNoteResponse) Field1DeepEqual(src []*Note) bool {\n\n\tif len(p.Notes) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.Notes {\n\t\t_src := src[i]\n\t\tif !v.DeepEqual(_src) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc (p *QueryNoteResponse) Field2DeepEqual(src int64) bool {\n\n\tif p.Total != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QueryNoteResponse) Field3DeepEqual(src *BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype MGetNoteRequest struct {\n\tNoteIds []int64 `thrift:\"note_ids,1\" json:\"note_ids\"`\n}\n\nfunc NewMGetNoteRequest() *MGetNoteRequest {\n\treturn &MGetNoteRequest{}\n}\n\nfunc (p *MGetNoteRequest) GetNoteIds() (v []int64) {\n\treturn p.NoteIds\n}\nfunc (p *MGetNoteRequest) SetNoteIds(val []int64) {\n\tp.NoteIds = val\n}\n\nvar fieldIDToName_MGetNoteRequest = map[int16]string{\n\t1: \"note_ids\",\n}\n\nfunc (p *MGetNoteRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetNoteRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetNoteRequest) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.NoteIds = make([]int64, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _elem int64\n\t\tif v, err := iprot.ReadI64(); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t_elem = v\n\t\t}\n\n\t\tp.NoteIds = append(p.NoteIds, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGetNoteRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetNoteRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *MGetNoteRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"note_ids\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.I64, len(p.NoteIds)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.NoteIds {\n\t\tif err := oprot.WriteI64(v); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *MGetNoteRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"MGetNoteRequest(%+v)\", *p)\n}\n\nfunc (p *MGetNoteRequest) DeepEqual(ano *MGetNoteRequest) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.NoteIds) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *MGetNoteRequest) Field1DeepEqual(src []int64) bool {\n\n\tif len(p.NoteIds) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.NoteIds {\n\t\t_src := src[i]\n\t\tif v != _src {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\ntype MGetNoteResponse struct {\n\tNotes    []*Note   `thrift:\"notes,1\" json:\"notes\"`\n\tBaseResp *BaseResp `thrift:\"base_resp,2\" json:\"base_resp\"`\n}\n\nfunc NewMGetNoteResponse() *MGetNoteResponse {\n\treturn &MGetNoteResponse{}\n}\n\nfunc (p *MGetNoteResponse) GetNotes() (v []*Note) {\n\treturn p.Notes\n}\n\nvar MGetNoteResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *MGetNoteResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn MGetNoteResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *MGetNoteResponse) SetNotes(val []*Note) {\n\tp.Notes = val\n}\nfunc (p *MGetNoteResponse) SetBaseResp(val *BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_MGetNoteResponse = map[int16]string{\n\t1: \"notes\",\n\t2: \"base_resp\",\n}\n\nfunc (p *MGetNoteResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *MGetNoteResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetNoteResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetNoteResponse) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Notes = make([]*Note, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewNote()\n\t\tif err := _elem.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.Notes = append(p.Notes, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGetNoteResponse) ReadField2(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGetNoteResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetNoteResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *MGetNoteResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"notes\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Notes)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Notes {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *MGetNoteResponse) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *MGetNoteResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"MGetNoteResponse(%+v)\", *p)\n}\n\nfunc (p *MGetNoteResponse) DeepEqual(ano *MGetNoteResponse) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Notes) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *MGetNoteResponse) Field1DeepEqual(src []*Note) bool {\n\n\tif len(p.Notes) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.Notes {\n\t\t_src := src[i]\n\t\tif !v.DeepEqual(_src) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc (p *MGetNoteResponse) Field2DeepEqual(src *BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteService interface {\n\tCreateNote(ctx context.Context, req *CreateNoteRequest) (r *CreateNoteResponse, err error)\n\n\tDeleteNote(ctx context.Context, req *DeleteNoteRequest) (r *DeleteNoteResponse, err error)\n\n\tUpdateNote(ctx context.Context, req *UpdateNoteRequest) (r *UpdateNoteResponse, err error)\n\n\tQueryNote(ctx context.Context, req *QueryNoteRequest) (r *QueryNoteResponse, err error)\n\n\tMGetNote(ctx context.Context, req *MGetNoteRequest) (r *MGetNoteResponse, err error)\n}\n\ntype NoteServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewNoteServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *NoteServiceClient {\n\treturn &NoteServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewNoteServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *NoteServiceClient {\n\treturn &NoteServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewNoteServiceClient(c thrift.TClient) *NoteServiceClient {\n\treturn &NoteServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *NoteServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *NoteServiceClient) CreateNote(ctx context.Context, req *CreateNoteRequest) (r *CreateNoteResponse, err error) {\n\tvar _args NoteServiceCreateNoteArgs\n\t_args.Req = req\n\tvar _result NoteServiceCreateNoteResult\n\tif err = p.Client_().Call(ctx, \"CreateNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *NoteServiceClient) DeleteNote(ctx context.Context, req *DeleteNoteRequest) (r *DeleteNoteResponse, err error) {\n\tvar _args NoteServiceDeleteNoteArgs\n\t_args.Req = req\n\tvar _result NoteServiceDeleteNoteResult\n\tif err = p.Client_().Call(ctx, \"DeleteNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *NoteServiceClient) UpdateNote(ctx context.Context, req *UpdateNoteRequest) (r *UpdateNoteResponse, err error) {\n\tvar _args NoteServiceUpdateNoteArgs\n\t_args.Req = req\n\tvar _result NoteServiceUpdateNoteResult\n\tif err = p.Client_().Call(ctx, \"UpdateNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *NoteServiceClient) QueryNote(ctx context.Context, req *QueryNoteRequest) (r *QueryNoteResponse, err error) {\n\tvar _args NoteServiceQueryNoteArgs\n\t_args.Req = req\n\tvar _result NoteServiceQueryNoteResult\n\tif err = p.Client_().Call(ctx, \"QueryNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *NoteServiceClient) MGetNote(ctx context.Context, req *MGetNoteRequest) (r *MGetNoteResponse, err error) {\n\tvar _args NoteServiceMGetNoteArgs\n\t_args.Req = req\n\tvar _result NoteServiceMGetNoteResult\n\tif err = p.Client_().Call(ctx, \"MGetNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype NoteServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      NoteService\n}\n\nfunc (p *NoteServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *NoteServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *NoteServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewNoteServiceProcessor(handler NoteService) *NoteServiceProcessor {\n\tself := &NoteServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"CreateNote\", &noteServiceProcessorCreateNote{handler: handler})\n\tself.AddToProcessorMap(\"DeleteNote\", &noteServiceProcessorDeleteNote{handler: handler})\n\tself.AddToProcessorMap(\"UpdateNote\", &noteServiceProcessorUpdateNote{handler: handler})\n\tself.AddToProcessorMap(\"QueryNote\", &noteServiceProcessorQueryNote{handler: handler})\n\tself.AddToProcessorMap(\"MGetNote\", &noteServiceProcessorMGetNote{handler: handler})\n\treturn self\n}\nfunc (p *NoteServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype noteServiceProcessorCreateNote struct {\n\thandler NoteService\n}\n\nfunc (p *noteServiceProcessorCreateNote) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := NoteServiceCreateNoteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CreateNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := NoteServiceCreateNoteResult{}\n\tvar retval *CreateNoteResponse\n\tif retval, err2 = p.handler.CreateNote(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CreateNote: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CreateNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CreateNote\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype noteServiceProcessorDeleteNote struct {\n\thandler NoteService\n}\n\nfunc (p *noteServiceProcessorDeleteNote) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := NoteServiceDeleteNoteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"DeleteNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := NoteServiceDeleteNoteResult{}\n\tvar retval *DeleteNoteResponse\n\tif retval, err2 = p.handler.DeleteNote(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing DeleteNote: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"DeleteNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"DeleteNote\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype noteServiceProcessorUpdateNote struct {\n\thandler NoteService\n}\n\nfunc (p *noteServiceProcessorUpdateNote) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := NoteServiceUpdateNoteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"UpdateNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := NoteServiceUpdateNoteResult{}\n\tvar retval *UpdateNoteResponse\n\tif retval, err2 = p.handler.UpdateNote(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing UpdateNote: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"UpdateNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"UpdateNote\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype noteServiceProcessorQueryNote struct {\n\thandler NoteService\n}\n\nfunc (p *noteServiceProcessorQueryNote) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := NoteServiceQueryNoteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"QueryNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := NoteServiceQueryNoteResult{}\n\tvar retval *QueryNoteResponse\n\tif retval, err2 = p.handler.QueryNote(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing QueryNote: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"QueryNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"QueryNote\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype noteServiceProcessorMGetNote struct {\n\thandler NoteService\n}\n\nfunc (p *noteServiceProcessorMGetNote) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := NoteServiceMGetNoteArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"MGetNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := NoteServiceMGetNoteResult{}\n\tvar retval *MGetNoteResponse\n\tif retval, err2 = p.handler.MGetNote(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing MGetNote: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"MGetNote\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"MGetNote\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype NoteServiceCreateNoteArgs struct {\n\tReq *CreateNoteRequest `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewNoteServiceCreateNoteArgs() *NoteServiceCreateNoteArgs {\n\treturn &NoteServiceCreateNoteArgs{}\n}\n\nvar NoteServiceCreateNoteArgs_Req_DEFAULT *CreateNoteRequest\n\nfunc (p *NoteServiceCreateNoteArgs) GetReq() (v *CreateNoteRequest) {\n\tif !p.IsSetReq() {\n\t\treturn NoteServiceCreateNoteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *NoteServiceCreateNoteArgs) SetReq(val *CreateNoteRequest) {\n\tp.Req = val\n}\n\nvar fieldIDToName_NoteServiceCreateNoteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *NoteServiceCreateNoteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *NoteServiceCreateNoteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceCreateNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceCreateNoteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCreateNoteRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceCreateNoteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateNote_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceCreateNoteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *NoteServiceCreateNoteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceCreateNoteArgs(%+v)\", *p)\n}\n\nfunc (p *NoteServiceCreateNoteArgs) DeepEqual(ano *NoteServiceCreateNoteArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceCreateNoteArgs) Field1DeepEqual(src *CreateNoteRequest) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteServiceCreateNoteResult struct {\n\tSuccess *CreateNoteResponse `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewNoteServiceCreateNoteResult() *NoteServiceCreateNoteResult {\n\treturn &NoteServiceCreateNoteResult{}\n}\n\nvar NoteServiceCreateNoteResult_Success_DEFAULT *CreateNoteResponse\n\nfunc (p *NoteServiceCreateNoteResult) GetSuccess() (v *CreateNoteResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn NoteServiceCreateNoteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *NoteServiceCreateNoteResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*CreateNoteResponse)\n}\n\nvar fieldIDToName_NoteServiceCreateNoteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *NoteServiceCreateNoteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *NoteServiceCreateNoteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceCreateNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceCreateNoteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCreateNoteResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceCreateNoteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateNote_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceCreateNoteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *NoteServiceCreateNoteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceCreateNoteResult(%+v)\", *p)\n}\n\nfunc (p *NoteServiceCreateNoteResult) DeepEqual(ano *NoteServiceCreateNoteResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceCreateNoteResult) Field0DeepEqual(src *CreateNoteResponse) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteServiceDeleteNoteArgs struct {\n\tReq *DeleteNoteRequest `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewNoteServiceDeleteNoteArgs() *NoteServiceDeleteNoteArgs {\n\treturn &NoteServiceDeleteNoteArgs{}\n}\n\nvar NoteServiceDeleteNoteArgs_Req_DEFAULT *DeleteNoteRequest\n\nfunc (p *NoteServiceDeleteNoteArgs) GetReq() (v *DeleteNoteRequest) {\n\tif !p.IsSetReq() {\n\t\treturn NoteServiceDeleteNoteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *NoteServiceDeleteNoteArgs) SetReq(val *DeleteNoteRequest) {\n\tp.Req = val\n}\n\nvar fieldIDToName_NoteServiceDeleteNoteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceDeleteNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewDeleteNoteRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteNote_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceDeleteNoteArgs(%+v)\", *p)\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) DeepEqual(ano *NoteServiceDeleteNoteArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceDeleteNoteArgs) Field1DeepEqual(src *DeleteNoteRequest) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteServiceDeleteNoteResult struct {\n\tSuccess *DeleteNoteResponse `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewNoteServiceDeleteNoteResult() *NoteServiceDeleteNoteResult {\n\treturn &NoteServiceDeleteNoteResult{}\n}\n\nvar NoteServiceDeleteNoteResult_Success_DEFAULT *DeleteNoteResponse\n\nfunc (p *NoteServiceDeleteNoteResult) GetSuccess() (v *DeleteNoteResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn NoteServiceDeleteNoteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *NoteServiceDeleteNoteResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*DeleteNoteResponse)\n}\n\nvar fieldIDToName_NoteServiceDeleteNoteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *NoteServiceDeleteNoteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *NoteServiceDeleteNoteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceDeleteNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceDeleteNoteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewDeleteNoteResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceDeleteNoteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"DeleteNote_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceDeleteNoteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *NoteServiceDeleteNoteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceDeleteNoteResult(%+v)\", *p)\n}\n\nfunc (p *NoteServiceDeleteNoteResult) DeepEqual(ano *NoteServiceDeleteNoteResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceDeleteNoteResult) Field0DeepEqual(src *DeleteNoteResponse) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteServiceUpdateNoteArgs struct {\n\tReq *UpdateNoteRequest `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewNoteServiceUpdateNoteArgs() *NoteServiceUpdateNoteArgs {\n\treturn &NoteServiceUpdateNoteArgs{}\n}\n\nvar NoteServiceUpdateNoteArgs_Req_DEFAULT *UpdateNoteRequest\n\nfunc (p *NoteServiceUpdateNoteArgs) GetReq() (v *UpdateNoteRequest) {\n\tif !p.IsSetReq() {\n\t\treturn NoteServiceUpdateNoteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *NoteServiceUpdateNoteArgs) SetReq(val *UpdateNoteRequest) {\n\tp.Req = val\n}\n\nvar fieldIDToName_NoteServiceUpdateNoteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceUpdateNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewUpdateNoteRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UpdateNote_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceUpdateNoteArgs(%+v)\", *p)\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) DeepEqual(ano *NoteServiceUpdateNoteArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceUpdateNoteArgs) Field1DeepEqual(src *UpdateNoteRequest) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteServiceUpdateNoteResult struct {\n\tSuccess *UpdateNoteResponse `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewNoteServiceUpdateNoteResult() *NoteServiceUpdateNoteResult {\n\treturn &NoteServiceUpdateNoteResult{}\n}\n\nvar NoteServiceUpdateNoteResult_Success_DEFAULT *UpdateNoteResponse\n\nfunc (p *NoteServiceUpdateNoteResult) GetSuccess() (v *UpdateNoteResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn NoteServiceUpdateNoteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *NoteServiceUpdateNoteResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*UpdateNoteResponse)\n}\n\nvar fieldIDToName_NoteServiceUpdateNoteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *NoteServiceUpdateNoteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *NoteServiceUpdateNoteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceUpdateNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceUpdateNoteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewUpdateNoteResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceUpdateNoteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UpdateNote_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceUpdateNoteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *NoteServiceUpdateNoteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceUpdateNoteResult(%+v)\", *p)\n}\n\nfunc (p *NoteServiceUpdateNoteResult) DeepEqual(ano *NoteServiceUpdateNoteResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceUpdateNoteResult) Field0DeepEqual(src *UpdateNoteResponse) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteServiceQueryNoteArgs struct {\n\tReq *QueryNoteRequest `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewNoteServiceQueryNoteArgs() *NoteServiceQueryNoteArgs {\n\treturn &NoteServiceQueryNoteArgs{}\n}\n\nvar NoteServiceQueryNoteArgs_Req_DEFAULT *QueryNoteRequest\n\nfunc (p *NoteServiceQueryNoteArgs) GetReq() (v *QueryNoteRequest) {\n\tif !p.IsSetReq() {\n\t\treturn NoteServiceQueryNoteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *NoteServiceQueryNoteArgs) SetReq(val *QueryNoteRequest) {\n\tp.Req = val\n}\n\nvar fieldIDToName_NoteServiceQueryNoteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *NoteServiceQueryNoteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *NoteServiceQueryNoteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceQueryNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceQueryNoteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewQueryNoteRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceQueryNoteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryNote_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceQueryNoteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *NoteServiceQueryNoteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceQueryNoteArgs(%+v)\", *p)\n}\n\nfunc (p *NoteServiceQueryNoteArgs) DeepEqual(ano *NoteServiceQueryNoteArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceQueryNoteArgs) Field1DeepEqual(src *QueryNoteRequest) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteServiceQueryNoteResult struct {\n\tSuccess *QueryNoteResponse `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewNoteServiceQueryNoteResult() *NoteServiceQueryNoteResult {\n\treturn &NoteServiceQueryNoteResult{}\n}\n\nvar NoteServiceQueryNoteResult_Success_DEFAULT *QueryNoteResponse\n\nfunc (p *NoteServiceQueryNoteResult) GetSuccess() (v *QueryNoteResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn NoteServiceQueryNoteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *NoteServiceQueryNoteResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*QueryNoteResponse)\n}\n\nvar fieldIDToName_NoteServiceQueryNoteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *NoteServiceQueryNoteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *NoteServiceQueryNoteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceQueryNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceQueryNoteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewQueryNoteResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceQueryNoteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryNote_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceQueryNoteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *NoteServiceQueryNoteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceQueryNoteResult(%+v)\", *p)\n}\n\nfunc (p *NoteServiceQueryNoteResult) DeepEqual(ano *NoteServiceQueryNoteResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceQueryNoteResult) Field0DeepEqual(src *QueryNoteResponse) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteServiceMGetNoteArgs struct {\n\tReq *MGetNoteRequest `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewNoteServiceMGetNoteArgs() *NoteServiceMGetNoteArgs {\n\treturn &NoteServiceMGetNoteArgs{}\n}\n\nvar NoteServiceMGetNoteArgs_Req_DEFAULT *MGetNoteRequest\n\nfunc (p *NoteServiceMGetNoteArgs) GetReq() (v *MGetNoteRequest) {\n\tif !p.IsSetReq() {\n\t\treturn NoteServiceMGetNoteArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *NoteServiceMGetNoteArgs) SetReq(val *MGetNoteRequest) {\n\tp.Req = val\n}\n\nvar fieldIDToName_NoteServiceMGetNoteArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *NoteServiceMGetNoteArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *NoteServiceMGetNoteArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceMGetNoteArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceMGetNoteArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewMGetNoteRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceMGetNoteArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetNote_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceMGetNoteArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *NoteServiceMGetNoteArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceMGetNoteArgs(%+v)\", *p)\n}\n\nfunc (p *NoteServiceMGetNoteArgs) DeepEqual(ano *NoteServiceMGetNoteArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceMGetNoteArgs) Field1DeepEqual(src *MGetNoteRequest) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype NoteServiceMGetNoteResult struct {\n\tSuccess *MGetNoteResponse `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewNoteServiceMGetNoteResult() *NoteServiceMGetNoteResult {\n\treturn &NoteServiceMGetNoteResult{}\n}\n\nvar NoteServiceMGetNoteResult_Success_DEFAULT *MGetNoteResponse\n\nfunc (p *NoteServiceMGetNoteResult) GetSuccess() (v *MGetNoteResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn NoteServiceMGetNoteResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *NoteServiceMGetNoteResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*MGetNoteResponse)\n}\n\nvar fieldIDToName_NoteServiceMGetNoteResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *NoteServiceMGetNoteResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *NoteServiceMGetNoteResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_NoteServiceMGetNoteResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceMGetNoteResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewMGetNoteResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *NoteServiceMGetNoteResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetNote_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *NoteServiceMGetNoteResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *NoteServiceMGetNoteResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"NoteServiceMGetNoteResult(%+v)\", *p)\n}\n\nfunc (p *NoteServiceMGetNoteResult) DeepEqual(ano *NoteServiceMGetNoteResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *NoteServiceMGetNoteResult) Field0DeepEqual(src *MGetNoteResponse) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demonote/note_validator.go",
    "content": "// Code generated by Validator v0.1.4. DO NOT EDIT.\n\npackage demonote\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = (*regexp.Regexp)(nil)\n\t_ = time.Nanosecond\n)\n\nfunc (p *BaseResp) IsValid() error {\n\treturn nil\n}\nfunc (p *Note) IsValid() error {\n\treturn nil\n}\nfunc (p *CreateNoteRequest) IsValid() error {\n\tif len(p.Title) < int(1) {\n\t\treturn fmt.Errorf(\"field Title min_len rule failed, current value: %d\", len(p.Title))\n\t}\n\tif len(p.Content) < int(1) {\n\t\treturn fmt.Errorf(\"field Content min_len rule failed, current value: %d\", len(p.Content))\n\t}\n\tif p.UserId <= int64(0) {\n\t\treturn fmt.Errorf(\"field UserId gt rule failed, current value: %v\", p.UserId)\n\t}\n\treturn nil\n}\nfunc (p *CreateNoteResponse) IsValid() error {\n\tif p.BaseResp != nil {\n\t\tif err := p.BaseResp.IsValid(); err != nil {\n\t\t\treturn fmt.Errorf(\"filed BaseResp not valid, %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\nfunc (p *DeleteNoteRequest) IsValid() error {\n\tif p.NoteId <= int64(0) {\n\t\treturn fmt.Errorf(\"field NoteId gt rule failed, current value: %v\", p.NoteId)\n\t}\n\treturn nil\n}\nfunc (p *DeleteNoteResponse) IsValid() error {\n\tif p.BaseResp != nil {\n\t\tif err := p.BaseResp.IsValid(); err != nil {\n\t\t\treturn fmt.Errorf(\"filed BaseResp not valid, %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\nfunc (p *UpdateNoteRequest) IsValid() error {\n\tif p.NoteId <= int64(0) {\n\t\treturn fmt.Errorf(\"field NoteId gt rule failed, current value: %v\", p.NoteId)\n\t}\n\treturn nil\n}\nfunc (p *UpdateNoteResponse) IsValid() error {\n\tif p.BaseResp != nil {\n\t\tif err := p.BaseResp.IsValid(); err != nil {\n\t\t\treturn fmt.Errorf(\"filed BaseResp not valid, %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\nfunc (p *QueryNoteRequest) IsValid() error {\n\tif p.UserId <= int64(0) {\n\t\treturn fmt.Errorf(\"field UserId gt rule failed, current value: %v\", p.UserId)\n\t}\n\tif p.Offset < int64(0) {\n\t\treturn fmt.Errorf(\"field Offset ge rule failed, current value: %v\", p.Offset)\n\t}\n\tif p.Limit < int64(0) {\n\t\treturn fmt.Errorf(\"field Limit ge rule failed, current value: %v\", p.Limit)\n\t}\n\treturn nil\n}\nfunc (p *QueryNoteResponse) IsValid() error {\n\tif p.BaseResp != nil {\n\t\tif err := p.BaseResp.IsValid(); err != nil {\n\t\t\treturn fmt.Errorf(\"filed BaseResp not valid, %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\nfunc (p *MGetNoteRequest) IsValid() error {\n\tif len(p.NoteIds) < int(1) {\n\t\treturn fmt.Errorf(\"field NoteIds MinLen rule failed, current value: %v\", p.NoteIds)\n\t}\n\treturn nil\n}\nfunc (p *MGetNoteResponse) IsValid() error {\n\tif p.BaseResp != nil {\n\t\tif err := p.BaseResp.IsValid(); err != nil {\n\t\t\treturn fmt.Errorf(\"filed BaseResp not valid, %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demonote/noteservice/client.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage noteservice\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCreateNote(ctx context.Context, req *demonote.CreateNoteRequest, callOptions ...callopt.Option) (r *demonote.CreateNoteResponse, err error)\n\tDeleteNote(ctx context.Context, req *demonote.DeleteNoteRequest, callOptions ...callopt.Option) (r *demonote.DeleteNoteResponse, err error)\n\tUpdateNote(ctx context.Context, req *demonote.UpdateNoteRequest, callOptions ...callopt.Option) (r *demonote.UpdateNoteResponse, err error)\n\tQueryNote(ctx context.Context, req *demonote.QueryNoteRequest, callOptions ...callopt.Option) (r *demonote.QueryNoteResponse, err error)\n\tMGetNote(ctx context.Context, req *demonote.MGetNoteRequest, callOptions ...callopt.Option) (r *demonote.MGetNoteResponse, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kNoteServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kNoteServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kNoteServiceClient) CreateNote(ctx context.Context, req *demonote.CreateNoteRequest, callOptions ...callopt.Option) (r *demonote.CreateNoteResponse, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.CreateNote(ctx, req)\n}\n\nfunc (p *kNoteServiceClient) DeleteNote(ctx context.Context, req *demonote.DeleteNoteRequest, callOptions ...callopt.Option) (r *demonote.DeleteNoteResponse, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.DeleteNote(ctx, req)\n}\n\nfunc (p *kNoteServiceClient) UpdateNote(ctx context.Context, req *demonote.UpdateNoteRequest, callOptions ...callopt.Option) (r *demonote.UpdateNoteResponse, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.UpdateNote(ctx, req)\n}\n\nfunc (p *kNoteServiceClient) QueryNote(ctx context.Context, req *demonote.QueryNoteRequest, callOptions ...callopt.Option) (r *demonote.QueryNoteResponse, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.QueryNote(ctx, req)\n}\n\nfunc (p *kNoteServiceClient) MGetNote(ctx context.Context, req *demonote.MGetNoteRequest, callOptions ...callopt.Option) (r *demonote.MGetNoteResponse, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.MGetNote(ctx, req)\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demonote/noteservice/invoker.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage noteservice\n\nimport (\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler demonote.NoteService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demonote/noteservice/noteservice.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage noteservice\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn noteServiceServiceInfo\n}\n\nvar noteServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"NoteService\"\n\thandlerType := (*demonote.NoteService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"CreateNote\": kitex.NewMethodInfo(createNoteHandler, newNoteServiceCreateNoteArgs, newNoteServiceCreateNoteResult, false),\n\t\t\"DeleteNote\": kitex.NewMethodInfo(deleteNoteHandler, newNoteServiceDeleteNoteArgs, newNoteServiceDeleteNoteResult, false),\n\t\t\"UpdateNote\": kitex.NewMethodInfo(updateNoteHandler, newNoteServiceUpdateNoteArgs, newNoteServiceUpdateNoteResult, false),\n\t\t\"QueryNote\":  kitex.NewMethodInfo(queryNoteHandler, newNoteServiceQueryNoteArgs, newNoteServiceQueryNoteResult, false),\n\t\t\"MGetNote\":   kitex.NewMethodInfo(mGetNoteHandler, newNoteServiceMGetNoteArgs, newNoteServiceMGetNoteResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"demonote\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.3\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc createNoteHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*demonote.NoteServiceCreateNoteArgs)\n\trealResult := result.(*demonote.NoteServiceCreateNoteResult)\n\tsuccess, err := handler.(demonote.NoteService).CreateNote(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newNoteServiceCreateNoteArgs() interface{} {\n\treturn demonote.NewNoteServiceCreateNoteArgs()\n}\n\nfunc newNoteServiceCreateNoteResult() interface{} {\n\treturn demonote.NewNoteServiceCreateNoteResult()\n}\n\nfunc deleteNoteHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*demonote.NoteServiceDeleteNoteArgs)\n\trealResult := result.(*demonote.NoteServiceDeleteNoteResult)\n\tsuccess, err := handler.(demonote.NoteService).DeleteNote(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newNoteServiceDeleteNoteArgs() interface{} {\n\treturn demonote.NewNoteServiceDeleteNoteArgs()\n}\n\nfunc newNoteServiceDeleteNoteResult() interface{} {\n\treturn demonote.NewNoteServiceDeleteNoteResult()\n}\n\nfunc updateNoteHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*demonote.NoteServiceUpdateNoteArgs)\n\trealResult := result.(*demonote.NoteServiceUpdateNoteResult)\n\tsuccess, err := handler.(demonote.NoteService).UpdateNote(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newNoteServiceUpdateNoteArgs() interface{} {\n\treturn demonote.NewNoteServiceUpdateNoteArgs()\n}\n\nfunc newNoteServiceUpdateNoteResult() interface{} {\n\treturn demonote.NewNoteServiceUpdateNoteResult()\n}\n\nfunc queryNoteHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*demonote.NoteServiceQueryNoteArgs)\n\trealResult := result.(*demonote.NoteServiceQueryNoteResult)\n\tsuccess, err := handler.(demonote.NoteService).QueryNote(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newNoteServiceQueryNoteArgs() interface{} {\n\treturn demonote.NewNoteServiceQueryNoteArgs()\n}\n\nfunc newNoteServiceQueryNoteResult() interface{} {\n\treturn demonote.NewNoteServiceQueryNoteResult()\n}\n\nfunc mGetNoteHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*demonote.NoteServiceMGetNoteArgs)\n\trealResult := result.(*demonote.NoteServiceMGetNoteResult)\n\tsuccess, err := handler.(demonote.NoteService).MGetNote(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newNoteServiceMGetNoteArgs() interface{} {\n\treturn demonote.NewNoteServiceMGetNoteArgs()\n}\n\nfunc newNoteServiceMGetNoteResult() interface{} {\n\treturn demonote.NewNoteServiceMGetNoteResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) CreateNote(ctx context.Context, req *demonote.CreateNoteRequest) (r *demonote.CreateNoteResponse, err error) {\n\tvar _args demonote.NoteServiceCreateNoteArgs\n\t_args.Req = req\n\tvar _result demonote.NoteServiceCreateNoteResult\n\tif err = p.c.Call(ctx, \"CreateNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) DeleteNote(ctx context.Context, req *demonote.DeleteNoteRequest) (r *demonote.DeleteNoteResponse, err error) {\n\tvar _args demonote.NoteServiceDeleteNoteArgs\n\t_args.Req = req\n\tvar _result demonote.NoteServiceDeleteNoteResult\n\tif err = p.c.Call(ctx, \"DeleteNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) UpdateNote(ctx context.Context, req *demonote.UpdateNoteRequest) (r *demonote.UpdateNoteResponse, err error) {\n\tvar _args demonote.NoteServiceUpdateNoteArgs\n\t_args.Req = req\n\tvar _result demonote.NoteServiceUpdateNoteResult\n\tif err = p.c.Call(ctx, \"UpdateNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) QueryNote(ctx context.Context, req *demonote.QueryNoteRequest) (r *demonote.QueryNoteResponse, err error) {\n\tvar _args demonote.NoteServiceQueryNoteArgs\n\t_args.Req = req\n\tvar _result demonote.NoteServiceQueryNoteResult\n\tif err = p.c.Call(ctx, \"QueryNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) MGetNote(ctx context.Context, req *demonote.MGetNoteRequest) (r *demonote.MGetNoteResponse, err error) {\n\tvar _args demonote.NoteServiceMGetNoteArgs\n\t_args.Req = req\n\tvar _result demonote.NoteServiceMGetNoteResult\n\tif err = p.c.Call(ctx, \"MGetNote\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demonote/noteservice/server.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\npackage noteservice\n\nimport (\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demonote\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler demonote.NoteService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demouser/k-consts.go",
    "content": "package demouser\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "easy_note/kitex_gen/demouser/k-user.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage demouser\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *BaseResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BaseResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StatusCode = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BaseResp) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.StatusMessage = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *BaseResp) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ServiceTime = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *BaseResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *BaseResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"BaseResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"BaseResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"status_code\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.StatusCode)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"status_message\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.StatusMessage)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"service_time\", thrift.I64, 3)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.ServiceTime)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *BaseResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"status_code\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.StatusCode)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"status_message\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.StatusMessage)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *BaseResp) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"service_time\", thrift.I64, 3)\n\tl += bthrift.Binary.I64Length(p.ServiceTime)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *User) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_User[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *User) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *User) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Username = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *User) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Avatar = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *User) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *User) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"User\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *User) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"User\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *User) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *User) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"username\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Username)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *User) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"avatar\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Avatar)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *User) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *User) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"username\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Username)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *User) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"avatar\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.Avatar)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserRequest) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserRequest[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserRequest) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Username = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CreateUserRequest) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Password = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CreateUserRequest) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CreateUserRequest) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateUserRequest\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserRequest) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateUserRequest\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserRequest) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"username\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Username)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserRequest) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"password\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Password)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserRequest) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"username\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Username)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserRequest) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"password\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Password)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserResponse) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserResponse[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserResponse) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CreateUserResponse) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CreateUserResponse) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateUserResponse\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserResponse) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateUserResponse\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CreateUserResponse) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"base_resp\", thrift.STRUCT, 1)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CreateUserResponse) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"base_resp\", thrift.STRUCT, 1)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserRequest) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetUserRequest[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetUserRequest) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.UserIds = make([]int64, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _elem int64\n\t\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\n\t\t\t_elem = v\n\n\t\t}\n\n\t\tp.UserIds = append(p.UserIds, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *MGetUserRequest) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *MGetUserRequest) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetUserRequest\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserRequest) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetUserRequest\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserRequest) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_ids\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.I64, 0)\n\tvar length int\n\tfor _, v := range p.UserIds {\n\t\tlength++\n\t\toffset += bthrift.Binary.WriteI64(buf[offset:], v)\n\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.I64, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserRequest) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_ids\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.I64, len(p.UserIds))\n\tvar tmpV int64\n\tl += bthrift.Binary.I64Length(int64(tmpV)) * len(p.UserIds)\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserResponse) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetUserResponse[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetUserResponse) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\t_, size, l, err := bthrift.Binary.ReadListBegin(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tp.Users = make([]*User, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewUser()\n\t\tif l, err := _elem.FastRead(buf[offset:]); err != nil {\n\t\t\treturn offset, err\n\t\t} else {\n\t\t\toffset += l\n\t\t}\n\n\t\tp.Users = append(p.Users, _elem)\n\t}\n\tif l, err := bthrift.Binary.ReadListEnd(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\treturn offset, nil\n}\n\nfunc (p *MGetUserResponse) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *MGetUserResponse) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *MGetUserResponse) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetUserResponse\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserResponse) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetUserResponse\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserResponse) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"users\", thrift.LIST, 1)\n\tlistBeginOffset := offset\n\toffset += bthrift.Binary.ListBeginLength(thrift.STRUCT, 0)\n\tvar length int\n\tfor _, v := range p.Users {\n\t\tlength++\n\t\toffset += v.FastWriteNocopy(buf[offset:], binaryWriter)\n\t}\n\tbthrift.Binary.WriteListBegin(buf[listBeginOffset:], thrift.STRUCT, length)\n\toffset += bthrift.Binary.WriteListEnd(buf[offset:])\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserResponse) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"base_resp\", thrift.STRUCT, 2)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *MGetUserResponse) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"users\", thrift.LIST, 1)\n\tl += bthrift.Binary.ListBeginLength(thrift.STRUCT, len(p.Users))\n\tfor _, v := range p.Users {\n\t\tl += v.BLength()\n\t}\n\tl += bthrift.Binary.ListEndLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *MGetUserResponse) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"base_resp\", thrift.STRUCT, 2)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserRequest) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserRequest[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserRequest) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Username = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CheckUserRequest) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Password = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CheckUserRequest) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CheckUserRequest) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CheckUserRequest\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserRequest) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CheckUserRequest\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserRequest) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"username\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Username)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserRequest) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"password\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Password)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserRequest) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"username\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Username)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserRequest) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"password\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.Password)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserResponse) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserResponse[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserResponse) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.UserId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *CheckUserResponse) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewBaseResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.BaseResp = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CheckUserResponse) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CheckUserResponse) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CheckUserResponse\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserResponse) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CheckUserResponse\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserResponse) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"user_id\", thrift.I64, 1)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.UserId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserResponse) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"base_resp\", thrift.STRUCT, 2)\n\toffset += p.BaseResp.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CheckUserResponse) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"user_id\", thrift.I64, 1)\n\tl += bthrift.Binary.I64Length(p.UserId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CheckUserResponse) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"base_resp\", thrift.STRUCT, 2)\n\tl += p.BaseResp.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCreateUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCreateUserRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceCreateUserArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceCreateUserArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateUser_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCreateUserArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateUser_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCreateUserArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCreateUserResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCreateUserResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceCreateUserResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceCreateUserResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CreateUser_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCreateUserResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CreateUser_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *UserServiceCreateUserResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *UserServiceMGetUserArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceMGetUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewMGetUserRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceMGetUserArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceMGetUserArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetUser_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceMGetUserArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetUser_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceMGetUserArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceMGetUserArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceMGetUserResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceMGetUserResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewMGetUserResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceMGetUserResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceMGetUserResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"MGetUser_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceMGetUserResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"MGetUser_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceMGetUserResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *UserServiceMGetUserResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *UserServiceCheckUserArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCheckUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCheckUserRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceCheckUserArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceCheckUserArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CheckUser_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCheckUserArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CheckUser_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCheckUserArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCheckUserArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCheckUserResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCheckUserResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCheckUserResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UserServiceCheckUserResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UserServiceCheckUserResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CheckUser_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UserServiceCheckUserResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CheckUser_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UserServiceCheckUserResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *UserServiceCheckUserResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *UserServiceCreateUserArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *UserServiceCreateUserResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *UserServiceMGetUserArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *UserServiceMGetUserResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *UserServiceCheckUserArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *UserServiceCheckUserResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demouser/user.go",
    "content": "// Code generated by thriftgo (0.2.3). DO NOT EDIT.\n\npackage demouser\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"database/sql/driver\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype ErrCode int64\n\nconst (\n\tErrCode_SuccessCode                ErrCode = 0\n\tErrCode_ServiceErrCode             ErrCode = 10001\n\tErrCode_ParamErrCode               ErrCode = 10002\n\tErrCode_UserAlreadyExistErrCode    ErrCode = 10003\n\tErrCode_AuthorizationFailedErrCode ErrCode = 10004\n)\n\nfunc (p ErrCode) String() string {\n\tswitch p {\n\tcase ErrCode_SuccessCode:\n\t\treturn \"SuccessCode\"\n\tcase ErrCode_ServiceErrCode:\n\t\treturn \"ServiceErrCode\"\n\tcase ErrCode_ParamErrCode:\n\t\treturn \"ParamErrCode\"\n\tcase ErrCode_UserAlreadyExistErrCode:\n\t\treturn \"UserAlreadyExistErrCode\"\n\tcase ErrCode_AuthorizationFailedErrCode:\n\t\treturn \"AuthorizationFailedErrCode\"\n\t}\n\treturn \"<UNSET>\"\n}\n\nfunc ErrCodeFromString(s string) (ErrCode, error) {\n\tswitch s {\n\tcase \"SuccessCode\":\n\t\treturn ErrCode_SuccessCode, nil\n\tcase \"ServiceErrCode\":\n\t\treturn ErrCode_ServiceErrCode, nil\n\tcase \"ParamErrCode\":\n\t\treturn ErrCode_ParamErrCode, nil\n\tcase \"UserAlreadyExistErrCode\":\n\t\treturn ErrCode_UserAlreadyExistErrCode, nil\n\tcase \"AuthorizationFailedErrCode\":\n\t\treturn ErrCode_AuthorizationFailedErrCode, nil\n\t}\n\treturn ErrCode(0), fmt.Errorf(\"not a valid ErrCode string\")\n}\n\nfunc ErrCodePtr(v ErrCode) *ErrCode { return &v }\nfunc (p *ErrCode) Scan(value interface{}) (err error) {\n\tvar result sql.NullInt64\n\terr = result.Scan(value)\n\t*p = ErrCode(result.Int64)\n\treturn\n}\n\nfunc (p *ErrCode) Value() (driver.Value, error) {\n\tif p == nil {\n\t\treturn nil, nil\n\t}\n\treturn int64(*p), nil\n}\n\ntype BaseResp struct {\n\tStatusCode    int64  `thrift:\"status_code,1\" json:\"status_code\"`\n\tStatusMessage string `thrift:\"status_message,2\" json:\"status_message\"`\n\tServiceTime   int64  `thrift:\"service_time,3\" json:\"service_time\"`\n}\n\nfunc NewBaseResp() *BaseResp {\n\treturn &BaseResp{}\n}\n\nfunc (p *BaseResp) GetStatusCode() (v int64) {\n\treturn p.StatusCode\n}\n\nfunc (p *BaseResp) GetStatusMessage() (v string) {\n\treturn p.StatusMessage\n}\n\nfunc (p *BaseResp) GetServiceTime() (v int64) {\n\treturn p.ServiceTime\n}\nfunc (p *BaseResp) SetStatusCode(val int64) {\n\tp.StatusCode = val\n}\nfunc (p *BaseResp) SetStatusMessage(val string) {\n\tp.StatusMessage = val\n}\nfunc (p *BaseResp) SetServiceTime(val int64) {\n\tp.ServiceTime = val\n}\n\nvar fieldIDToName_BaseResp = map[int16]string{\n\t1: \"status_code\",\n\t2: \"status_message\",\n\t3: \"service_time\",\n}\n\nfunc (p *BaseResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_BaseResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusCode = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.StatusMessage = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ServiceTime = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaseResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"BaseResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"status_code\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.StatusCode); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"status_message\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.StatusMessage); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *BaseResp) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"service_time\", thrift.I64, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.ServiceTime); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *BaseResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BaseResp(%+v)\", *p)\n}\n\nfunc (p *BaseResp) DeepEqual(ano *BaseResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.StatusCode) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.StatusMessage) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.ServiceTime) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *BaseResp) Field1DeepEqual(src int64) bool {\n\n\tif p.StatusCode != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BaseResp) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.StatusMessage, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *BaseResp) Field3DeepEqual(src int64) bool {\n\n\tif p.ServiceTime != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype User struct {\n\tUserId   int64  `thrift:\"user_id,1\" json:\"user_id\"`\n\tUsername string `thrift:\"username,2\" json:\"username\"`\n\tAvatar   string `thrift:\"avatar,3\" json:\"avatar\"`\n}\n\nfunc NewUser() *User {\n\treturn &User{}\n}\n\nfunc (p *User) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nfunc (p *User) GetUsername() (v string) {\n\treturn p.Username\n}\n\nfunc (p *User) GetAvatar() (v string) {\n\treturn p.Avatar\n}\nfunc (p *User) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *User) SetUsername(val string) {\n\tp.Username = val\n}\nfunc (p *User) SetAvatar(val string) {\n\tp.Avatar = val\n}\n\nvar fieldIDToName_User = map[int16]string{\n\t1: \"user_id\",\n\t2: \"username\",\n\t3: \"avatar\",\n}\n\nfunc (p *User) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_User[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *User) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *User) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Username = v\n\t}\n\treturn nil\n}\n\nfunc (p *User) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Avatar = v\n\t}\n\treturn nil\n}\n\nfunc (p *User) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"User\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *User) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *User) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"username\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Username); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *User) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"avatar\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Avatar); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *User) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"User(%+v)\", *p)\n}\n\nfunc (p *User) DeepEqual(ano *User) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Username) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Avatar) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *User) Field1DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *User) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Username, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *User) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Avatar, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CreateUserRequest struct {\n\tUsername string `thrift:\"username,1\" json:\"username\"`\n\tPassword string `thrift:\"password,2\" json:\"password\"`\n}\n\nfunc NewCreateUserRequest() *CreateUserRequest {\n\treturn &CreateUserRequest{}\n}\n\nfunc (p *CreateUserRequest) GetUsername() (v string) {\n\treturn p.Username\n}\n\nfunc (p *CreateUserRequest) GetPassword() (v string) {\n\treturn p.Password\n}\nfunc (p *CreateUserRequest) SetUsername(val string) {\n\tp.Username = val\n}\nfunc (p *CreateUserRequest) SetPassword(val string) {\n\tp.Password = val\n}\n\nvar fieldIDToName_CreateUserRequest = map[int16]string{\n\t1: \"username\",\n\t2: \"password\",\n}\n\nfunc (p *CreateUserRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Username = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateUserRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Password = v\n\t}\n\treturn nil\n}\n\nfunc (p *CreateUserRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUserRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateUserRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"username\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Username); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateUserRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"password\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Password); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CreateUserRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateUserRequest(%+v)\", *p)\n}\n\nfunc (p *CreateUserRequest) DeepEqual(ano *CreateUserRequest) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Username) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Password) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CreateUserRequest) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Username, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CreateUserRequest) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Password, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CreateUserResponse struct {\n\tBaseResp *BaseResp `thrift:\"base_resp,1\" json:\"base_resp\"`\n}\n\nfunc NewCreateUserResponse() *CreateUserResponse {\n\treturn &CreateUserResponse{}\n}\n\nvar CreateUserResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *CreateUserResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CreateUserResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *CreateUserResponse) SetBaseResp(val *BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_CreateUserResponse = map[int16]string{\n\t1: \"base_resp\",\n}\n\nfunc (p *CreateUserResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CreateUserResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CreateUserResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CreateUserResponse) ReadField1(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CreateUserResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUserResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CreateUserResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CreateUserResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CreateUserResponse(%+v)\", *p)\n}\n\nfunc (p *CreateUserResponse) DeepEqual(ano *CreateUserResponse) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CreateUserResponse) Field1DeepEqual(src *BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype MGetUserRequest struct {\n\tUserIds []int64 `thrift:\"user_ids,1\" json:\"user_ids\"`\n}\n\nfunc NewMGetUserRequest() *MGetUserRequest {\n\treturn &MGetUserRequest{}\n}\n\nfunc (p *MGetUserRequest) GetUserIds() (v []int64) {\n\treturn p.UserIds\n}\nfunc (p *MGetUserRequest) SetUserIds(val []int64) {\n\tp.UserIds = val\n}\n\nvar fieldIDToName_MGetUserRequest = map[int16]string{\n\t1: \"user_ids\",\n}\n\nfunc (p *MGetUserRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetUserRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetUserRequest) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.UserIds = make([]int64, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\tvar _elem int64\n\t\tif v, err := iprot.ReadI64(); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t_elem = v\n\t\t}\n\n\t\tp.UserIds = append(p.UserIds, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGetUserRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetUserRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *MGetUserRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_ids\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.I64, len(p.UserIds)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.UserIds {\n\t\tif err := oprot.WriteI64(v); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *MGetUserRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"MGetUserRequest(%+v)\", *p)\n}\n\nfunc (p *MGetUserRequest) DeepEqual(ano *MGetUserRequest) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserIds) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *MGetUserRequest) Field1DeepEqual(src []int64) bool {\n\n\tif len(p.UserIds) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.UserIds {\n\t\t_src := src[i]\n\t\tif v != _src {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\ntype MGetUserResponse struct {\n\tUsers    []*User   `thrift:\"users,1\" json:\"users\"`\n\tBaseResp *BaseResp `thrift:\"base_resp,2\" json:\"base_resp\"`\n}\n\nfunc NewMGetUserResponse() *MGetUserResponse {\n\treturn &MGetUserResponse{}\n}\n\nfunc (p *MGetUserResponse) GetUsers() (v []*User) {\n\treturn p.Users\n}\n\nvar MGetUserResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *MGetUserResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn MGetUserResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *MGetUserResponse) SetUsers(val []*User) {\n\tp.Users = val\n}\nfunc (p *MGetUserResponse) SetBaseResp(val *BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_MGetUserResponse = map[int16]string{\n\t1: \"users\",\n\t2: \"base_resp\",\n}\n\nfunc (p *MGetUserResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *MGetUserResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.LIST {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_MGetUserResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *MGetUserResponse) ReadField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.Users = make([]*User, 0, size)\n\tfor i := 0; i < size; i++ {\n\t\t_elem := NewUser()\n\t\tif err := _elem.Read(iprot); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tp.Users = append(p.Users, _elem)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGetUserResponse) ReadField2(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *MGetUserResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetUserResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *MGetUserResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"users\", thrift.LIST, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Users)); err != nil {\n\t\treturn err\n\t}\n\tfor _, v := range p.Users {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *MGetUserResponse) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *MGetUserResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"MGetUserResponse(%+v)\", *p)\n}\n\nfunc (p *MGetUserResponse) DeepEqual(ano *MGetUserResponse) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Users) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *MGetUserResponse) Field1DeepEqual(src []*User) bool {\n\n\tif len(p.Users) != len(src) {\n\t\treturn false\n\t}\n\tfor i, v := range p.Users {\n\t\t_src := src[i]\n\t\tif !v.DeepEqual(_src) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc (p *MGetUserResponse) Field2DeepEqual(src *BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CheckUserRequest struct {\n\tUsername string `thrift:\"username,1\" json:\"username\"`\n\tPassword string `thrift:\"password,2\" json:\"password\"`\n}\n\nfunc NewCheckUserRequest() *CheckUserRequest {\n\treturn &CheckUserRequest{}\n}\n\nfunc (p *CheckUserRequest) GetUsername() (v string) {\n\treturn p.Username\n}\n\nfunc (p *CheckUserRequest) GetPassword() (v string) {\n\treturn p.Password\n}\nfunc (p *CheckUserRequest) SetUsername(val string) {\n\tp.Username = val\n}\nfunc (p *CheckUserRequest) SetPassword(val string) {\n\tp.Password = val\n}\n\nvar fieldIDToName_CheckUserRequest = map[int16]string{\n\t1: \"username\",\n\t2: \"password\",\n}\n\nfunc (p *CheckUserRequest) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserRequest[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserRequest) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Username = v\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserRequest) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Password = v\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserRequest) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUserRequest\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CheckUserRequest) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"username\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Username); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CheckUserRequest) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"password\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Password); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CheckUserRequest) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CheckUserRequest(%+v)\", *p)\n}\n\nfunc (p *CheckUserRequest) DeepEqual(ano *CheckUserRequest) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Username) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.Password) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CheckUserRequest) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Username, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CheckUserRequest) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Password, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CheckUserResponse struct {\n\tUserId   int64     `thrift:\"user_id,1\" json:\"user_id\"`\n\tBaseResp *BaseResp `thrift:\"base_resp,2\" json:\"base_resp\"`\n}\n\nfunc NewCheckUserResponse() *CheckUserResponse {\n\treturn &CheckUserResponse{}\n}\n\nfunc (p *CheckUserResponse) GetUserId() (v int64) {\n\treturn p.UserId\n}\n\nvar CheckUserResponse_BaseResp_DEFAULT *BaseResp\n\nfunc (p *CheckUserResponse) GetBaseResp() (v *BaseResp) {\n\tif !p.IsSetBaseResp() {\n\t\treturn CheckUserResponse_BaseResp_DEFAULT\n\t}\n\treturn p.BaseResp\n}\nfunc (p *CheckUserResponse) SetUserId(val int64) {\n\tp.UserId = val\n}\nfunc (p *CheckUserResponse) SetBaseResp(val *BaseResp) {\n\tp.BaseResp = val\n}\n\nvar fieldIDToName_CheckUserResponse = map[int16]string{\n\t1: \"user_id\",\n\t2: \"base_resp\",\n}\n\nfunc (p *CheckUserResponse) IsSetBaseResp() bool {\n\treturn p.BaseResp != nil\n}\n\nfunc (p *CheckUserResponse) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CheckUserResponse[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CheckUserResponse) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.UserId = v\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserResponse) ReadField2(iprot thrift.TProtocol) error {\n\tp.BaseResp = NewBaseResp()\n\tif err := p.BaseResp.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *CheckUserResponse) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUserResponse\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CheckUserResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"user_id\", thrift.I64, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.UserId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CheckUserResponse) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"base_resp\", thrift.STRUCT, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.BaseResp.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *CheckUserResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CheckUserResponse(%+v)\", *p)\n}\n\nfunc (p *CheckUserResponse) DeepEqual(ano *CheckUserResponse) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.UserId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.BaseResp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CheckUserResponse) Field1DeepEqual(src int64) bool {\n\n\tif p.UserId != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *CheckUserResponse) Field2DeepEqual(src *BaseResp) bool {\n\n\tif !p.BaseResp.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserService interface {\n\tCreateUser(ctx context.Context, req *CreateUserRequest) (r *CreateUserResponse, err error)\n\n\tMGetUser(ctx context.Context, req *MGetUserRequest) (r *MGetUserResponse, err error)\n\n\tCheckUser(ctx context.Context, req *CheckUserRequest) (r *CheckUserResponse, err error)\n}\n\ntype UserServiceClient struct {\n\tc thrift.TClient\n}\n\nfunc NewUserServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *UserServiceClient {\n\treturn &UserServiceClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewUserServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *UserServiceClient {\n\treturn &UserServiceClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewUserServiceClient(c thrift.TClient) *UserServiceClient {\n\treturn &UserServiceClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *UserServiceClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *UserServiceClient) CreateUser(ctx context.Context, req *CreateUserRequest) (r *CreateUserResponse, err error) {\n\tvar _args UserServiceCreateUserArgs\n\t_args.Req = req\n\tvar _result UserServiceCreateUserResult\n\tif err = p.Client_().Call(ctx, \"CreateUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *UserServiceClient) MGetUser(ctx context.Context, req *MGetUserRequest) (r *MGetUserResponse, err error) {\n\tvar _args UserServiceMGetUserArgs\n\t_args.Req = req\n\tvar _result UserServiceMGetUserResult\n\tif err = p.Client_().Call(ctx, \"MGetUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\nfunc (p *UserServiceClient) CheckUser(ctx context.Context, req *CheckUserRequest) (r *CheckUserResponse, err error) {\n\tvar _args UserServiceCheckUserArgs\n\t_args.Req = req\n\tvar _result UserServiceCheckUserResult\n\tif err = p.Client_().Call(ctx, \"CheckUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype UserServiceProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      UserService\n}\n\nfunc (p *UserServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *UserServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *UserServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewUserServiceProcessor(handler UserService) *UserServiceProcessor {\n\tself := &UserServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"CreateUser\", &userServiceProcessorCreateUser{handler: handler})\n\tself.AddToProcessorMap(\"MGetUser\", &userServiceProcessorMGetUser{handler: handler})\n\tself.AddToProcessorMap(\"CheckUser\", &userServiceProcessorCheckUser{handler: handler})\n\treturn self\n}\nfunc (p *UserServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype userServiceProcessorCreateUser struct {\n\thandler UserService\n}\n\nfunc (p *userServiceProcessorCreateUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := UserServiceCreateUserArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CreateUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := UserServiceCreateUserResult{}\n\tvar retval *CreateUserResponse\n\tif retval, err2 = p.handler.CreateUser(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CreateUser: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CreateUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CreateUser\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype userServiceProcessorMGetUser struct {\n\thandler UserService\n}\n\nfunc (p *userServiceProcessorMGetUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := UserServiceMGetUserArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"MGetUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := UserServiceMGetUserResult{}\n\tvar retval *MGetUserResponse\n\tif retval, err2 = p.handler.MGetUser(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing MGetUser: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"MGetUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"MGetUser\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype userServiceProcessorCheckUser struct {\n\thandler UserService\n}\n\nfunc (p *userServiceProcessorCheckUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := UserServiceCheckUserArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CheckUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := UserServiceCheckUserResult{}\n\tvar retval *CheckUserResponse\n\tif retval, err2 = p.handler.CheckUser(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CheckUser: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CheckUser\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CheckUser\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype UserServiceCreateUserArgs struct {\n\tReq *CreateUserRequest `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewUserServiceCreateUserArgs() *UserServiceCreateUserArgs {\n\treturn &UserServiceCreateUserArgs{}\n}\n\nvar UserServiceCreateUserArgs_Req_DEFAULT *CreateUserRequest\n\nfunc (p *UserServiceCreateUserArgs) GetReq() (v *CreateUserRequest) {\n\tif !p.IsSetReq() {\n\t\treturn UserServiceCreateUserArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *UserServiceCreateUserArgs) SetReq(val *CreateUserRequest) {\n\tp.Req = val\n}\n\nvar fieldIDToName_UserServiceCreateUserArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *UserServiceCreateUserArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *UserServiceCreateUserArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCreateUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCreateUserRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceCreateUserArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUser_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceCreateUserArgs(%+v)\", *p)\n}\n\nfunc (p *UserServiceCreateUserArgs) DeepEqual(ano *UserServiceCreateUserArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceCreateUserArgs) Field1DeepEqual(src *CreateUserRequest) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceCreateUserResult struct {\n\tSuccess *CreateUserResponse `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewUserServiceCreateUserResult() *UserServiceCreateUserResult {\n\treturn &UserServiceCreateUserResult{}\n}\n\nvar UserServiceCreateUserResult_Success_DEFAULT *CreateUserResponse\n\nfunc (p *UserServiceCreateUserResult) GetSuccess() (v *CreateUserResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn UserServiceCreateUserResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *UserServiceCreateUserResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*CreateUserResponse)\n}\n\nvar fieldIDToName_UserServiceCreateUserResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *UserServiceCreateUserResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *UserServiceCreateUserResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCreateUserResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCreateUserResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceCreateUserResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CreateUser_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *UserServiceCreateUserResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceCreateUserResult(%+v)\", *p)\n}\n\nfunc (p *UserServiceCreateUserResult) DeepEqual(ano *UserServiceCreateUserResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceCreateUserResult) Field0DeepEqual(src *CreateUserResponse) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceMGetUserArgs struct {\n\tReq *MGetUserRequest `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewUserServiceMGetUserArgs() *UserServiceMGetUserArgs {\n\treturn &UserServiceMGetUserArgs{}\n}\n\nvar UserServiceMGetUserArgs_Req_DEFAULT *MGetUserRequest\n\nfunc (p *UserServiceMGetUserArgs) GetReq() (v *MGetUserRequest) {\n\tif !p.IsSetReq() {\n\t\treturn UserServiceMGetUserArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *UserServiceMGetUserArgs) SetReq(val *MGetUserRequest) {\n\tp.Req = val\n}\n\nvar fieldIDToName_UserServiceMGetUserArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *UserServiceMGetUserArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *UserServiceMGetUserArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceMGetUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewMGetUserRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceMGetUserArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetUser_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceMGetUserArgs(%+v)\", *p)\n}\n\nfunc (p *UserServiceMGetUserArgs) DeepEqual(ano *UserServiceMGetUserArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceMGetUserArgs) Field1DeepEqual(src *MGetUserRequest) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceMGetUserResult struct {\n\tSuccess *MGetUserResponse `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewUserServiceMGetUserResult() *UserServiceMGetUserResult {\n\treturn &UserServiceMGetUserResult{}\n}\n\nvar UserServiceMGetUserResult_Success_DEFAULT *MGetUserResponse\n\nfunc (p *UserServiceMGetUserResult) GetSuccess() (v *MGetUserResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn UserServiceMGetUserResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *UserServiceMGetUserResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*MGetUserResponse)\n}\n\nvar fieldIDToName_UserServiceMGetUserResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *UserServiceMGetUserResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *UserServiceMGetUserResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceMGetUserResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewMGetUserResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceMGetUserResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"MGetUser_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *UserServiceMGetUserResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceMGetUserResult(%+v)\", *p)\n}\n\nfunc (p *UserServiceMGetUserResult) DeepEqual(ano *UserServiceMGetUserResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceMGetUserResult) Field0DeepEqual(src *MGetUserResponse) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceCheckUserArgs struct {\n\tReq *CheckUserRequest `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewUserServiceCheckUserArgs() *UserServiceCheckUserArgs {\n\treturn &UserServiceCheckUserArgs{}\n}\n\nvar UserServiceCheckUserArgs_Req_DEFAULT *CheckUserRequest\n\nfunc (p *UserServiceCheckUserArgs) GetReq() (v *CheckUserRequest) {\n\tif !p.IsSetReq() {\n\t\treturn UserServiceCheckUserArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *UserServiceCheckUserArgs) SetReq(val *CheckUserRequest) {\n\tp.Req = val\n}\n\nvar fieldIDToName_UserServiceCheckUserArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *UserServiceCheckUserArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *UserServiceCheckUserArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCheckUserArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCheckUserRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceCheckUserArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUser_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceCheckUserArgs(%+v)\", *p)\n}\n\nfunc (p *UserServiceCheckUserArgs) DeepEqual(ano *UserServiceCheckUserArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceCheckUserArgs) Field1DeepEqual(src *CheckUserRequest) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UserServiceCheckUserResult struct {\n\tSuccess *CheckUserResponse `thrift:\"success,0,optional\" json:\"success,omitempty\"`\n}\n\nfunc NewUserServiceCheckUserResult() *UserServiceCheckUserResult {\n\treturn &UserServiceCheckUserResult{}\n}\n\nvar UserServiceCheckUserResult_Success_DEFAULT *CheckUserResponse\n\nfunc (p *UserServiceCheckUserResult) GetSuccess() (v *CheckUserResponse) {\n\tif !p.IsSetSuccess() {\n\t\treturn UserServiceCheckUserResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *UserServiceCheckUserResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*CheckUserResponse)\n}\n\nvar fieldIDToName_UserServiceCheckUserResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *UserServiceCheckUserResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *UserServiceCheckUserResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UserServiceCheckUserResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCheckUserResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *UserServiceCheckUserResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CheckUser_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *UserServiceCheckUserResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UserServiceCheckUserResult(%+v)\", *p)\n}\n\nfunc (p *UserServiceCheckUserResult) DeepEqual(ano *UserServiceCheckUserResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UserServiceCheckUserResult) Field0DeepEqual(src *CheckUserResponse) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demouser/user_validator.go",
    "content": "// Code generated by Validator v0.1.4. DO NOT EDIT.\n\npackage demouser\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = (*regexp.Regexp)(nil)\n\t_ = time.Nanosecond\n)\n\nfunc (p *BaseResp) IsValid() error {\n\treturn nil\n}\nfunc (p *User) IsValid() error {\n\treturn nil\n}\nfunc (p *CreateUserRequest) IsValid() error {\n\tif len(p.Username) < int(1) {\n\t\treturn fmt.Errorf(\"field Username min_len rule failed, current value: %d\", len(p.Username))\n\t}\n\tif len(p.Password) < int(1) {\n\t\treturn fmt.Errorf(\"field Password min_len rule failed, current value: %d\", len(p.Password))\n\t}\n\treturn nil\n}\nfunc (p *CreateUserResponse) IsValid() error {\n\tif p.BaseResp != nil {\n\t\tif err := p.BaseResp.IsValid(); err != nil {\n\t\t\treturn fmt.Errorf(\"filed BaseResp not valid, %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\nfunc (p *MGetUserRequest) IsValid() error {\n\tif len(p.UserIds) < int(1) {\n\t\treturn fmt.Errorf(\"field UserIds MinLen rule failed, current value: %v\", p.UserIds)\n\t}\n\treturn nil\n}\nfunc (p *MGetUserResponse) IsValid() error {\n\tif p.BaseResp != nil {\n\t\tif err := p.BaseResp.IsValid(); err != nil {\n\t\t\treturn fmt.Errorf(\"filed BaseResp not valid, %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\nfunc (p *CheckUserRequest) IsValid() error {\n\tif len(p.Username) < int(1) {\n\t\treturn fmt.Errorf(\"field Username min_len rule failed, current value: %d\", len(p.Username))\n\t}\n\tif len(p.Password) < int(1) {\n\t\treturn fmt.Errorf(\"field Password min_len rule failed, current value: %d\", len(p.Password))\n\t}\n\treturn nil\n}\nfunc (p *CheckUserResponse) IsValid() error {\n\tif p.BaseResp != nil {\n\t\tif err := p.BaseResp.IsValid(); err != nil {\n\t\t\treturn fmt.Errorf(\"filed BaseResp not valid, %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demouser/userservice/client.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCreateUser(ctx context.Context, req *demouser.CreateUserRequest, callOptions ...callopt.Option) (r *demouser.CreateUserResponse, err error)\n\tMGetUser(ctx context.Context, req *demouser.MGetUserRequest, callOptions ...callopt.Option) (r *demouser.MGetUserResponse, err error)\n\tCheckUser(ctx context.Context, req *demouser.CheckUserRequest, callOptions ...callopt.Option) (r *demouser.CheckUserResponse, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) CreateUser(ctx context.Context, req *demouser.CreateUserRequest, callOptions ...callopt.Option) (r *demouser.CreateUserResponse, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.CreateUser(ctx, req)\n}\n\nfunc (p *kUserServiceClient) MGetUser(ctx context.Context, req *demouser.MGetUserRequest, callOptions ...callopt.Option) (r *demouser.MGetUserResponse, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.MGetUser(ctx, req)\n}\n\nfunc (p *kUserServiceClient) CheckUser(ctx context.Context, req *demouser.CheckUserRequest, callOptions ...callopt.Option) (r *demouser.CheckUserResponse, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.CheckUser(ctx, req)\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demouser/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler demouser.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demouser/userservice/server.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\npackage userservice\n\nimport (\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler demouser.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "easy_note/kitex_gen/demouser/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*demouser.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"CreateUser\": kitex.NewMethodInfo(createUserHandler, newUserServiceCreateUserArgs, newUserServiceCreateUserResult, false),\n\t\t\"MGetUser\":   kitex.NewMethodInfo(mGetUserHandler, newUserServiceMGetUserArgs, newUserServiceMGetUserResult, false),\n\t\t\"CheckUser\":  kitex.NewMethodInfo(checkUserHandler, newUserServiceCheckUserArgs, newUserServiceCheckUserResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"demouser\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.3\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc createUserHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*demouser.UserServiceCreateUserArgs)\n\trealResult := result.(*demouser.UserServiceCreateUserResult)\n\tsuccess, err := handler.(demouser.UserService).CreateUser(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newUserServiceCreateUserArgs() interface{} {\n\treturn demouser.NewUserServiceCreateUserArgs()\n}\n\nfunc newUserServiceCreateUserResult() interface{} {\n\treturn demouser.NewUserServiceCreateUserResult()\n}\n\nfunc mGetUserHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*demouser.UserServiceMGetUserArgs)\n\trealResult := result.(*demouser.UserServiceMGetUserResult)\n\tsuccess, err := handler.(demouser.UserService).MGetUser(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newUserServiceMGetUserArgs() interface{} {\n\treturn demouser.NewUserServiceMGetUserArgs()\n}\n\nfunc newUserServiceMGetUserResult() interface{} {\n\treturn demouser.NewUserServiceMGetUserResult()\n}\n\nfunc checkUserHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*demouser.UserServiceCheckUserArgs)\n\trealResult := result.(*demouser.UserServiceCheckUserResult)\n\tsuccess, err := handler.(demouser.UserService).CheckUser(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newUserServiceCheckUserArgs() interface{} {\n\treturn demouser.NewUserServiceCheckUserArgs()\n}\n\nfunc newUserServiceCheckUserResult() interface{} {\n\treturn demouser.NewUserServiceCheckUserResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) CreateUser(ctx context.Context, req *demouser.CreateUserRequest) (r *demouser.CreateUserResponse, err error) {\n\tvar _args demouser.UserServiceCreateUserArgs\n\t_args.Req = req\n\tvar _result demouser.UserServiceCreateUserResult\n\tif err = p.c.Call(ctx, \"CreateUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) MGetUser(ctx context.Context, req *demouser.MGetUserRequest) (r *demouser.MGetUserResponse, err error) {\n\tvar _args demouser.UserServiceMGetUserArgs\n\t_args.Req = req\n\tvar _result demouser.UserServiceMGetUserResult\n\tif err = p.c.Call(ctx, \"MGetUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) CheckUser(ctx context.Context, req *demouser.CheckUserRequest) (r *demouser.CheckUserResponse, err error) {\n\tvar _args demouser.UserServiceCheckUserArgs\n\t_args.Req = req\n\tvar _result demouser.UserServiceCheckUserResult\n\tif err = p.c.Call(ctx, \"CheckUser\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "easy_note/licenses/LICENSE-gorm-mysql.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-NOW  Jinzhu <wosmvp@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "easy_note/licenses/LICENSE-gorm.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-NOW  Jinzhu <wosmvp@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "easy_note/licenses/LICENSE-opentelemetry-go.txt",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "easy_note/licenses/LICENSE-thrift.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n--------------------------------------------------\nSOFTWARE DISTRIBUTED WITH THRIFT:\n\nThe Apache Thrift software includes a number of subcomponents with\nseparate copyright notices and license terms. Your use of the source\ncode for the these subcomponents is subject to the terms and\nconditions of the following licenses.\n\n--------------------------------------------------\nPortions of the following files are licensed under the MIT License:\n\n  lib/erl/src/Makefile.am\n\nPlease see doc/otp-base-license.txt for the full terms of this license.\n\n--------------------------------------------------\nFor the aclocal/ax_boost_base.m4 and contrib/fb303/aclocal/ax_boost_base.m4 components:\n\n#   Copyright (c) 2007 Thomas Porschberg <thomas@randspringer.de>\n#\n#   Copying and distribution of this file, with or without\n#   modification, are permitted in any medium without royalty provided\n#   the copyright notice and this notice are preserved.\n\n--------------------------------------------------\nFor the lib/nodejs/lib/thrift/json_parse.js:\n\n/*\n    json_parse.js\n    2015-05-02\n    Public Domain.\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n*/\n(By Douglas Crockford <douglas@crockford.com>)\n\n--------------------------------------------------\nFor lib/cpp/src/thrift/windows/SocketPair.cpp\n\n/* socketpair.c\n * Copyright 2007 by Nathan C. Myers <ncm@cantrip.org>; some rights reserved.\n * This code is Free Software.  It may be copied freely, in original or\n * modified form, subject only to the restrictions that (1) the author is\n * relieved from all responsibilities for any use for any purpose, and (2)\n * this copyright notice must be retained, unchanged, in its entirety.  If\n * for any reason the author might be held responsible for any consequences\n * of copying or use, license is withheld.\n */\n\n\n--------------------------------------------------\nFor lib/py/compat/win32/stdint.h\n\n// ISO C9x  compliant stdint.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124\n//\n//  Copyright (c) 2006-2008 Alexander Chemeris\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//\n//   3. The name of the author may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n\n--------------------------------------------------\nCodegen template in t_html_generator.h\n\n* Bootstrap v2.0.3\n*\n* Copyright 2012 Twitter, Inc\n* Licensed under the Apache License v2.0\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Designed and built with all the love in the world @twitter by @mdo and @fat.\n\n---------------------------------------------------\nFor t_cl_generator.cc\n\n * Copyright (c) 2008- Patrick Collison <patrick@collison.ie>\n * Copyright (c) 2006- Facebook\n\n---------------------------------------------------"
  },
  {
    "path": "easy_note/pkg/configs/otel/otel-collector-config.yaml",
    "content": "receivers:\n  otlp:\n    protocols:\n      grpc:\n\nexporters:\n  prometheusremotewrite:\n    endpoint: \"http://victoriametrics:8428/api/v1/write\"\n\n  logging:\n\n  otlp:\n    endpoint: jaeger-all-in-one:4317\n    tls:\n      insecure: true\n\nprocessors:\n  batch:\n\nextensions:\n  health_check:\n  pprof:\n    endpoint: :1888\n  zpages:\n    endpoint: :55679\n\nservice:\n  extensions: [ pprof, zpages, health_check ]\n  pipelines:\n    traces:\n      receivers: [ otlp ]\n      processors: [ batch ]\n      exporters: [ logging, otlp ]\n    metrics:\n      receivers: [ otlp ]\n      processors: [ batch ]\n      exporters: [ logging, prometheusremotewrite ]\n"
  },
  {
    "path": "easy_note/pkg/configs/sql/init.sql",
    "content": "CREATE TABLE `user`\n(\n    `id`         bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',\n    `username`   varchar(128) NOT NULL DEFAULT '' COMMENT 'Username',\n    `password`   varchar(128) NOT NULL DEFAULT '' COMMENT 'Password',\n    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'User account create time',\n    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'User account update time',\n    `deleted_at` timestamp NULL DEFAULT NULL COMMENT 'User account delete time',\n    PRIMARY KEY (`id`),\n    KEY          `idx_username` (`username`) COMMENT 'Username index'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='User account table';\n\nCREATE TABLE `note`\n(\n    `id`         bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',\n    `user_id`    int(64) NOT NULL DEFAULT 0 COMMENT 'UserID',\n    `title`      varchar(128) NOT NULL DEFAULT '' COMMENT 'Title',\n    `content`    TEXT NULL COMMENT 'Content',\n    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Note create time',\n    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Note update time',\n    `deleted_at` timestamp NULL DEFAULT NULL COMMENT 'Note delete time',\n    PRIMARY KEY (`id`),\n    KEY          `idx_user_id_title` (`user_id`, `title`) COMMENT 'UserID Title index'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Note table';"
  },
  {
    "path": "easy_note/pkg/consts/consts.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage consts\n\nconst (\n\tNoteTableName   = \"note\"\n\tUserTableName   = \"user\"\n\tSecretKey       = \"secret key\"\n\tIdentityKey     = \"id\"\n\tTotal           = \"total\"\n\tNotes           = \"notes\"\n\tApiServiceName  = \"demoapi\"\n\tNoteServiceName = \"demonote\"\n\tUserServiceName = \"demouser\"\n\tMySQLDefaultDSN = \"gorm:gorm@tcp(localhost:3306)/gorm?charset=utf8&parseTime=True&loc=Local\"\n\tTCP             = \"tcp\"\n\tUserServiceAddr = \":9000\"\n\tNoteServiceAddr = \":10000\"\n\tExportEndpoint  = \":4317\"\n\tETCDAddress     = \"127.0.0.1:2379\"\n\tDefaultLimit    = 10\n)\n"
  },
  {
    "path": "easy_note/pkg/errno/errno.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage errno\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/easy_note/kitex_gen/demouser\"\n)\n\ntype ErrNo struct {\n\tErrCode int64\n\tErrMsg  string\n}\n\nfunc (e ErrNo) Error() string {\n\treturn fmt.Sprintf(\"err_code=%d, err_msg=%s\", e.ErrCode, e.ErrMsg)\n}\n\nfunc NewErrNo(code int64, msg string) ErrNo {\n\treturn ErrNo{\n\t\tErrCode: code,\n\t\tErrMsg:  msg,\n\t}\n}\n\nfunc (e ErrNo) WithMessage(msg string) ErrNo {\n\te.ErrMsg = msg\n\treturn e\n}\n\nvar (\n\tSuccess                = NewErrNo(int64(demouser.ErrCode_SuccessCode), \"Success\")\n\tServiceErr             = NewErrNo(int64(demouser.ErrCode_ServiceErrCode), \"Service is unable to start successfully\")\n\tParamErr               = NewErrNo(int64(demouser.ErrCode_ParamErrCode), \"Wrong Parameter has been given\")\n\tUserAlreadyExistErr    = NewErrNo(int64(demouser.ErrCode_UserAlreadyExistErrCode), \"User already exists\")\n\tAuthorizationFailedErr = NewErrNo(int64(demouser.ErrCode_AuthorizationFailedErrCode), \"Authorization failed\")\n)\n\n// ConvertErr convert error to Errno\nfunc ConvertErr(err error) ErrNo {\n\tErr := ErrNo{}\n\tif errors.As(err, &Err) {\n\t\treturn Err\n\t}\n\ts := ServiceErr\n\ts.ErrMsg = err.Error()\n\treturn s\n}\n"
  },
  {
    "path": "easy_note/pkg/mw/client.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage mw\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/pkg/endpoint\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n)\n\nvar _ endpoint.Middleware = ClientMiddleware\n\n// ClientMiddleware client mw print server address, rpc timeout and connection timeout\nfunc ClientMiddleware(next endpoint.Endpoint) endpoint.Endpoint {\n\treturn func(ctx context.Context, req, resp interface{}) (err error) {\n\t\tri := rpcinfo.GetRPCInfo(ctx)\n\t\t// get server information\n\t\tklog.Infof(\"server address: %v, rpc timeout: %v, readwrite timeout: %v\\n\", ri.To().Address(), ri.Config().RPCTimeout(), ri.Config().ConnectTimeout())\n\t\tif err = next(ctx, req, resp); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "easy_note/pkg/mw/common.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage mw\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/pkg/endpoint\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n)\n\nvar _ endpoint.Middleware = CommonMiddleware\n\n// CommonMiddleware common mw print some rpc info, real request and real response\nfunc CommonMiddleware(next endpoint.Endpoint) endpoint.Endpoint {\n\treturn func(ctx context.Context, req, resp interface{}) (err error) {\n\t\tri := rpcinfo.GetRPCInfo(ctx)\n\t\t// get real request\n\t\tklog.Infof(\"real request: %+v\\n\", req)\n\t\t// get remote service information\n\t\tklog.Infof(\"remote service name: %s, remote method: %s\\n\", ri.To().ServiceName(), ri.To().Method())\n\t\tif err = next(ctx, req, resp); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// get real response\n\t\tklog.Infof(\"real response: %+v\\n\", resp)\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "easy_note/pkg/mw/server.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage mw\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/pkg/endpoint\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n)\n\nvar _ endpoint.Middleware = ServerMiddleware\n\n// ServerMiddleware server mw print client address\nfunc ServerMiddleware(next endpoint.Endpoint) endpoint.Endpoint {\n\treturn func(ctx context.Context, req, resp interface{}) (err error) {\n\t\tri := rpcinfo.GetRPCInfo(ctx)\n\t\t// get client information\n\t\tklog.Infof(\"client address: %v\\n\", ri.From().Address())\n\t\tif err = next(ctx, req, resp); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "gomall/.gitignore",
    "content": ".DS_Store\napp/cart/.env\napp/**/nohup.out\n.idea/\napp/**/log/\napp/**/tmp/\napp/**/kitex_gen/\n\ngo.work.sum"
  },
  {
    "path": "gomall/Makefile",
    "content": ".PHONY: all\nall: help\n\ndefault: help\n\n.PHONY: help\nhelp: ## Display this help.\n\t@awk 'BEGIN {FS = \":.*##\"; printf \"\\nUsage:\\n  make \\033[36m<target>\\033[0m\\n\"} /^[a-zA-Z_0-9-]+:.*?##/ { printf \"  \\033[36m%-15s\\033[0m %s\\n\", $$1, $$2 } /^##@/ { printf \"\\n\\033[1m%s\\033[0m\\n\", substr($$0, 5) } ' $(MAKEFILE_LIST)\n\n##@ Initialize Project\n.PHONY: init\ninit: ## Just copy `.env.example` to `.env` with one click, executed once.\n\t@scripts/copy_env.sh\n\n##@ Build\n\n.PHONY: gen\ngen: ## gen client code of {svc}. example: make gen svc=product\n\t@scripts/gen.sh ${svc}\n\n.PHONY: gen-client\ngen-client: ## gen client code of {svc}. example: make gen-client svc=product\n\t@cd rpc_gen && cwgo client --type RPC --service ${svc} --module github.com/cloudwego/biz-demo/gomall/rpc_gen  -I ../idl  --idl ../idl/${svc}.proto\n\n.PHONY: gen-server\ngen-server: ## gen service code of {svc}. example: make gen-server svc=product\n\t@cd app/${svc} && cwgo server --type RPC --service ${svc} --module github.com/cloudwego/biz-demo/gomall/app/${svc} --pass \"-use github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/${svc}.proto\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl ../../idl/frontend/checkout_page.proto\n\n##@ Build\n\n.PHONY: watch-frontend\nwatch-frontend:\n\t@cd app/frontend && air\n\n.PHONY: tidy\ntidy: ## run `go mod tidy` for all go module\n\t@scripts/tidy.sh\n\n.PHONY: lint\nlint: ## run `gofmt` for all go module\n\t@gofmt -l -w app\n\t@gofumpt -l -w  app\n\n.PHONY: vet\nvet: ## run `go vet` for all go module\n\t@scripts/vet.sh\n\n.PHONY: lint-fix\nlint-fix: ## run `golangci-lint` for all go module\n\t@scripts/fix.sh\n\n.PHONY: run\nrun: ## run {svc} server. example: make run svc=product\n\t@scripts/run.sh ${svc}\n\n##@ Development Env\n\n.PHONY: env-start\nenv-start:  ## launch all middleware software as the docker\n\t@docker-compose up -d\n\n.PHONY: env-stop\nenv-stop: ## stop all docker\n\t@docker-compose down\n\n.PHONY: clean\nclean: ## clern up all the tmp files\n\t@rm -r app/**/log/ app/**/tmp/\n\n##@ Open Browser\n\n.PHONY: open.gomall\nopen-gomall: ## open `gomall` website in the default browser\n\t@open \"http://localhost:8080/\"\n\n.PHONY: open.consul\nopen-consul: ## open `consul ui` in the default browser\n\t@open \"http://localhost:8500/ui/\"\n\n.PHONY: open.jaeger\nopen-jaeger: ## open `jaeger ui` in the default browser\n\t@open \"http://localhost:16686/search\"\n\n.PHONY: open.prometheus\nopen-prometheus: ## open `prometheus ui` in the default browser\n\t@open \"http://localhost:9090\"\n\n"
  },
  {
    "path": "gomall/README.md",
    "content": "# Gomall\n[中文](README_cn.md)\n\nThis is a teaching project for newbie using CloudWeGo\n\n## Technology Stack\n| technology | introduce |\n|---------------|----|\n| cwgo          | -  |\n| kitex         | -  |\n| [bootstrap](https://getbootstrap.com/docs/5.3/getting-started/introduction/) | Bootstrap is a powerful, feature-packed frontend toolkit. Build anything—from prototype to production—in minutes.  |\n| Hertz         | -  |\n| MySQL         | -  |\n| Redis         | -  |\n| ES            | -  |\n| Prometheus    | -  |\n| Jaeger        | -  |\n| Docker        | -  |\n\n\n## Biz Logic\n- [x] The pages check auth\n- [x] Register\n- [x] Login\n- [x] Logout\n- [x] Product categories\n- [x] Products\n- [x] Add to cart\n- [x] The number badge of cart products\n- [x] Checkout\n- [x] Payment\n- [x] Orders center\n\n## How to use\n### Prepare \nList required\n- Go\n- IDE / Code Editor\n- Docker\n- [cwgo](https://github.com/cloudwego/cwgo)\n- kitex `go install github.com/cloudwego/kitex/tool/cmd/kitex@latest`\n- [Air](https://github.com/cosmtrek/air)\n- ...\n\n### Clone code\n```\ngit clone ...\n```\n\n### Copy `.env` file\n```\nmake init\n```\n*Note:*`You must generate and input SESSION_SECRET random value for session`\n\n### Download go module\n```\nmake tidy\n```\n\n### Start Docker Compose\n```\nmake env-start\n```\nif you want to stop their docker application,you can run `make env-stop`.\n\n### Run Service\nThis cmd must appoint a service.\n\n*Note:* `Run the Go server using air. So it must be installed`\n```\nmake run svc=`svcName`\n```\n### View Gomall Website\n```\nmake open-gomall\n```\n### Check Registry\n```\nmake open-consul\n```\n### Make Usage\n```\nmake\n```\n## Contributors\n- [rogerogers](https://github.com/rogerogers)\n- [baiyutang](https://github.com/baiyutang)\n"
  },
  {
    "path": "gomall/README_cn.md",
    "content": "# Gomall\n[EN](README.md)\n\n新人学习 CloudWeGo 的教学项目\n\n## 技术栈\n| 技术            | 介绍 |\n|---------------|----|\n| cwgo          | -  |\n| kitex         | -  |\n| [bootstrap](https://getbootstrap.com/docs/5.3/getting-started/introduction/) | Bootstrap is a powerful, feature-packed frontend toolkit. Build anything—from prototype to production—in minutes.  |\n| Hertz         | -  |\n| MySQL         | -  |\n| Redis         | -  |\n| ES            | -  |\n| Prometheus    | -  |\n| Jaeger        | -  |\n| Docker        | -  |\n\n## 业务逻辑\n- [x] 页面访问认证检查\n- [x] 注册\n- [x] 登录\n- [x] 退出\n- [x] 产品分类\n- [x] 产品\n- [x] 加购\n- [x] 购物车数量角标\n- [x] 下单\n- [x] 支付\n- [x] 订单中心\n\n## 如何使用\n### 准备\n必备清单\n- Go\n- IDE / Code Editor\n- Docker\n- [cwgo](https://github.com/cloudwego/cwgo)\n- kitex `go install github.com/cloudwego/kitex/tool/cmd/kitex@latest`\n- [Air](https://github.com/cosmtrek/air)\n- ...\n\n### 克隆项目\n```\ngit clone ...\n```\n\n### 拷贝 `.env` 文件\n```\nmake init\n```\n*Note:*`必须生成并输入 SESSION_SECRET 值供 session 功能正常使用`\n### 下载 Go 依赖\n```\nmake tidy\n```\n\n### 启动容器\n```\nmake env-start\n```\nif you want to stop their docker application,you can run `make env-stop`.\n\n### 启动某服务\n该命令必须执行一个服务\n\n*注意:* `我们使用 air 运行并热加载，必须先安装好`\n```\nmake run svc=`svcName`\n```\n### 浏览 Gomall 站点\n```\nmake open-gomall\n```\n### 查看注册中心\n```\nmake open-consul\n```\n### Make 用法\n```\nmake\n```\n## 贡献者\n- [rogerogers](https://github.com/rogerogers)\n- [baiyutang](https://github.com/baiyutang)\n"
  },
  {
    "path": "gomall/app/cart/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/app/cart/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/plugin/opentelemetry/tracing\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif err := DB.Use(tracing.NewPlugin(tracing.WithoutMetrics(), tracing.WithTracerProvider(mtl.TracerProvider))); err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\t//nolint:errcheck\n\t\tDB.AutoMigrate(\n\t\t\t&model.Cart{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/model/cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Cart struct {\n\tBase\n\tUserId    uint32 `json:\"user_id\"`\n\tProductId uint32 `json:\"product_id\"`\n\tQty       uint32 `json:\"qty\"`\n}\n\nfunc (c Cart) TableName() string {\n\treturn \"cart\"\n}\n\nfunc GetCartByUserId(db *gorm.DB, ctx context.Context, userId uint32) (cartList []*Cart, err error) {\n\terr = db.Debug().WithContext(ctx).Model(&Cart{}).Find(&cartList, \"user_id = ?\", userId).Error\n\treturn cartList, err\n}\n\nfunc AddCart(db *gorm.DB, ctx context.Context, c *Cart) error {\n\tvar find Cart\n\terr := db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).First(&find).Error\n\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\treturn err\n\t}\n\tif find.ID != 0 {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).UpdateColumn(\"qty\", gorm.Expr(\"qty+?\", c.Qty)).Error\n\t} else {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Create(c).Error\n\t}\n\treturn err\n}\n\nfunc EmptyCart(db *gorm.DB, ctx context.Context, userId uint32) error {\n\tif userId == 0 {\n\t\treturn errors.New(\"user_is is required\")\n\t}\n\treturn db.WithContext(ctx).Delete(&Cart{}, \"user_id = ?\", userId).Error\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/model/cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n"
  },
  {
    "path": "gomall/app/cart/biz/service/add_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype AddItemService struct {\n\tctx context.Context\n} // NewAddItemService new AddItemService\nfunc NewAddItemService(ctx context.Context) *AddItemService {\n\treturn &AddItemService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *AddItemService) Run(req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\t// Finish your business logic.\n\tgetProduct, err := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: req.Item.GetProductId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif getProduct.Product == nil || getProduct.Product.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40004, \"product not exist\")\n\t}\n\n\terr = model.AddCart(mysql.DB, s.ctx, &model.Cart{\n\t\tUserId:    req.UserId,\n\t\tProductId: req.Item.ProductId,\n\t\tQty:       uint32(req.Item.Quantity),\n\t})\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\n\treturn &cart.AddItemResp{}, nil\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/service/add_item_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestAddItem_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/service/empty_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype EmptyCartService struct {\n\tctx context.Context\n} // NewEmptyCartService new EmptyCartService\nfunc NewEmptyCartService(ctx context.Context) *EmptyCartService {\n\treturn &EmptyCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EmptyCartService) Run(req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\t// Finish your business logic.\n\terr = model.EmptyCart(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn &cart.EmptyCartResp{}, kerrors.NewBizStatusError(50001, \"empty cart error\")\n\t}\n\n\treturn &cart.EmptyCartResp{}, nil\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/service/empty_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestEmptyCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetCartService struct {\n\tctx context.Context\n} // NewGetCartService new GetCartService\nfunc NewGetCartService(ctx context.Context) *GetCartService {\n\treturn &GetCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetCartService) Run(req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\t// resp = &cart.Cart{}\n\t// Finish your business logic.\n\tcarts, err := model.GetCartByUserId(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\tvar items []*cart.CartItem\n\tfor _, v := range carts {\n\t\titems = append(items, &cart.CartItem{ProductId: v.ProductId, Quantity: int32(v.Qty)})\n\t}\n\n\treturn &cart.GetCartResp{Cart: &cart.Cart{UserId: req.GetUserId(), Items: items}}, nil\n}\n"
  },
  {
    "path": "gomall/app/cart/biz/service/get_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/app/cart/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cart\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/app/cart/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/app/cart/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/cart/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/cart/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/cart/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/app/cart/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/cart\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/common => ../../common\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n\tgorm.io/plugin/opentelemetry v0.1.4\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/app/cart/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI=\ngithub.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/driver/sqlite v1.5.0 h1:zKYbzRCpBrT1bNijRnxLDJWPjVfImGEn0lSnUY5gZ+c=\ngorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/plugin/opentelemetry v0.1.4 h1:7p0ocWELjSSRI7NCKPW2mVe6h43YPini99sNJcbsTuc=\ngorm.io/plugin/opentelemetry v0.1.4/go.mod h1:tndJHOdvPT0pyGhOb8E2209eXJCUxhC5UpKw7bGVWeI=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/app/cart/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/service\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\n// CartServiceImpl implements the last service interface defined in the IDL.\ntype CartServiceImpl struct{}\n\n// AddItem implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) AddItem(ctx context.Context, req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\tresp, err = service.NewAddItemService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) GetCart(ctx context.Context, req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\tresp, err = service.NewGetCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// EmptyCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) EmptyCart(ctx context.Context, req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = service.NewEmptyCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/app/cart/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\tcartutils \"github.com/cloudwego/biz-demo/gomall/app/cart/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\tProductClient productcatalogservice.Client\n\tonce          sync.Once\n\terr           error\n\tregistryAddr  string\n\tserviceName   string\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tregistryAddr = conf.GetConf().Registry.RegistryAddress[0]\n\t\tserviceName = conf.GetConf().Kitex.Service\n\t\tinitProductClient()\n\t})\n}\n\nfunc initProductClient() {\n\topts := []client.Option{\n\t\tclient.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\t\tRegistryAddr:       registryAddr,\n\t\t\tCurrentServiceName: serviceName,\n\t\t}),\n\t}\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcartutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/app/cart/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'cart'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/app/cart/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"strings\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitLog(&lumberjack.Logger{\n\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t})\n\tmtl.InitTracing(serviceName)\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\trpc.InitClient()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := cartservice.NewServer(new(CartServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddress := conf.GetConf().Kitex.Address\n\tif strings.HasPrefix(address, \":\") {\n\t\tlocalIp := utils.MustGetLocalIPv4()\n\t\taddress = localIp + address\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts,\n\t\tserver.WithServiceAddr(addr),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName, RegistryAddr: conf.GetConf().Registry.RegistryAddress[0]}))\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/cart/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/app/cart/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/cart\"\nexec \"$CURDIR/bin/cart\"\n"
  },
  {
    "path": "gomall/app/cart/script/cart.sql",
    "content": "create table cart\n(\n    id         int auto_increment,\n    user_id    int      not null,\n    product_id int      not null,\n    qty        int      not null,\n    created_at datetime not null default current_timestamp,\n    updated_at datetime not null default current_timestamp on update current_timestamp,\n    constraint cart_pk primary key (id)\n);"
  },
  {
    "path": "gomall/app/cart/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/app/cart/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/checkout/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/app/checkout/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/app/checkout/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/checkout/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/checkout/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/nats-io/nats.go\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\ntype CheckoutService struct {\n\tctx context.Context\n} // NewCheckoutService new CheckoutService\nfunc NewCheckoutService(ctx context.Context) *CheckoutService {\n\treturn &CheckoutService{ctx: ctx}\n}\n\n/*\n\tRun\n\n1. get cart\n2. calculate cart\n3. create order\n4. empty cart\n5. pay\n6. change order result\n7. finish\n*/\nfunc (s *CheckoutService) Run(req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\t// Finish your business logic.\n\t// Idempotent\n\t// get cart\n\tcartResult, err := rpc.CartClient.GetCart(s.ctx, &cart.GetCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\tklog.Error(err)\n\t\terr = fmt.Errorf(\"GetCart.err:%v\", err)\n\t\treturn\n\t}\n\tif cartResult == nil || cartResult.Cart == nil || len(cartResult.Cart.Items) == 0 {\n\t\terr = errors.New(\"cart is empty\")\n\t\treturn\n\t}\n\tvar (\n\t\toi    []*order.OrderItem\n\t\ttotal float32\n\t)\n\tfor _, cartItem := range cartResult.Cart.Items {\n\t\tproductResp, resultErr := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: cartItem.ProductId})\n\t\tif resultErr != nil {\n\t\t\tklog.Error(resultErr)\n\t\t\terr = resultErr\n\t\t\treturn\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\tcost := p.Price * float32(cartItem.Quantity)\n\t\ttotal += cost\n\t\toi = append(oi, &order.OrderItem{\n\t\t\tItem: &cart.CartItem{ProductId: cartItem.ProductId, Quantity: cartItem.Quantity},\n\t\t\tCost: cost,\n\t\t})\n\t}\n\t// create order\n\torderReq := &order.PlaceOrderReq{\n\t\tUserId:       req.UserId,\n\t\tUserCurrency: \"USD\",\n\t\tOrderItems:   oi,\n\t\tEmail:        req.Email,\n\t}\n\tif req.Address != nil {\n\t\taddr := req.Address\n\t\tzipCodeInt, _ := strconv.Atoi(addr.ZipCode)\n\t\torderReq.Address = &order.Address{\n\t\t\tStreetAddress: addr.StreetAddress,\n\t\t\tCity:          addr.City,\n\t\t\tCountry:       addr.Country,\n\t\t\tState:         addr.State,\n\t\t\tZipCode:       int32(zipCodeInt),\n\t\t}\n\t}\n\torderResult, err := rpc.OrderClient.PlaceOrder(s.ctx, orderReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"PlaceOrder.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(\"orderResult\", orderResult)\n\t// empty cart\n\temptyResult, err := rpc.CartClient.EmptyCart(s.ctx, &cart.EmptyCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\terr = fmt.Errorf(\"EmptyCart.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(emptyResult)\n\t// charge\n\tvar orderId string\n\tif orderResult != nil || orderResult.Order != nil {\n\t\torderId = orderResult.Order.OrderId\n\t}\n\tpayReq := &payment.ChargeReq{\n\t\tUserId:  req.UserId,\n\t\tOrderId: orderId,\n\t\tAmount:  total,\n\t\tCreditCard: &payment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CreditCard.CreditCardNumber,\n\t\t\tCreditCardExpirationYear:  req.CreditCard.CreditCardExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.CreditCard.CreditCardExpirationMonth,\n\t\t\tCreditCardCvv:             req.CreditCard.CreditCardCvv,\n\t\t},\n\t}\n\tpaymentResult, err := rpc.PaymentClient.Charge(s.ctx, payReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"Charge.err:%v\", err)\n\t\treturn\n\t}\n\tdata, _ := proto.Marshal(&email.EmailReq{\n\t\tFrom:        \"from@example.com\",\n\t\tTo:          req.Email,\n\t\tContentType: \"text/plain\",\n\t\tSubject:     \"You just created an order in CloudWeGo shop\",\n\t\tContent:     \"You just created an order in CloudWeGo shop\",\n\t})\n\tmsg := &nats.Msg{Subject: \"email\", Data: data, Header: make(nats.Header)}\n\n\t// otel inject\n\totel.GetTextMapPropagator().Inject(s.ctx, propagation.HeaderCarrier(msg.Header))\n\n\t_ = mq.Nc.PublishMsg(msg)\n\n\tklog.Info(paymentResult)\n\t// change order state\n\tklog.Info(orderResult)\n\t_, err = rpc.OrderClient.MarkOrderPaid(s.ctx, &order.MarkOrderPaidReq{UserId: req.UserId, OrderId: orderId})\n\tif err != nil {\n\t\tklog.Error(err)\n\t\treturn\n\t}\n\n\tresp = &checkout.CheckoutResp{\n\t\tOrderId:       orderId,\n\t\tTransactionId: paymentResult.TransactionId,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/checkout/biz/service/checkout_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCheckout_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/app/checkout/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"checkout\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/app/checkout/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/app/checkout/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/checkout/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/checkout/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/checkout/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/app/checkout/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/checkout\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace (\n\tgithub.com/cloudwego/biz-demo/gomall/common => ../../common\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.39.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.opentelemetry.io/otel v1.25.0\n\tgoogle.golang.org/protobuf v1.33.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 // indirect\n\tgithub.com/klauspost/compress v1.17.9 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.9 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/app/checkout/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=\ngithub.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nats-io/nats.go v1.39.1 h1:oTkfKBmz7W047vRxV762M67ZdXeOtUgvbBaNoQ+3PPk=\ngithub.com/nats-io/nats.go v1.39.1/go.mod h1:MgRb8oOdigA6cYpEPhXJuRVH6UE/V4jblJ2jQ27IXYM=\ngithub.com/nats-io/nkeys v0.4.9 h1:qe9Faq2Gxwi6RZnZMXfmGMZkg3afLLOtrU+gDZJ35b0=\ngithub.com/nats-io/nkeys v0.4.9/go.mod h1:jcMqs+FLG+W5YO36OX6wFIFcmpdAns+w1Wm6D3I/evE=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/app/checkout/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/service\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n)\n\n// CheckoutServiceImpl implements the last service interface defined in the IDL.\ntype CheckoutServiceImpl struct{}\n\n// PlaceOrder implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) PlaceOrder(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Checkout implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) Checkout(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/app/checkout/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(nats.DefaultURL)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/checkout/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\tcheckoututils \"github.com/cloudwego/biz-demo/gomall/app/checkout/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\tCartClient    cartservice.Client\n\tProductClient productcatalogservice.Client\n\tPaymentClient paymentservice.Client\n\tOrderClient   orderservice.Client\n\tonce          sync.Once\n\terr           error\n\tregistryAddr  string\n\tserviceName   string\n\tcommonSuite   client.Option\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tregistryAddr = conf.GetConf().Registry.RegistryAddress[0]\n\t\tserviceName = conf.GetConf().Kitex.Service\n\t\tcommonSuite = client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\t\tCurrentServiceName: serviceName,\n\t\t\tRegistryAddr:       registryAddr,\n\t\t})\n\t\tinitCartClient()\n\t\tinitProductClient()\n\t\tinitPaymentClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initProductClient() {\n\tProductClient, err = productcatalogservice.NewClient(\"product\", commonSuite)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tCartClient, err = cartservice.NewClient(\"cart\", commonSuite)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initPaymentClient() {\n\tPaymentClient, err = paymentservice.NewClient(\"payment\", commonSuite)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tOrderClient, err = orderservice.NewClient(\"order\", commonSuite)\n\tcheckoututils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/app/checkout/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'checkout'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/app/checkout/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"strings\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitLog(&lumberjack.Logger{\n\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t})\n\tmtl.InitTracing(serviceName)\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\trpc.InitClient()\n\tmq.Init()\n\topts := kitexInit()\n\n\tsvr := checkoutservice.NewServer(new(CheckoutServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddress := conf.GetConf().Kitex.Address\n\tif strings.HasPrefix(address, \":\") {\n\t\tlocalIp := utils.MustGetLocalIPv4()\n\t\taddress = localIp + address\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\topts = append(opts, server.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName, RegistryAddr: conf.GetConf().Registry.RegistryAddress[0]}))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/checkout/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/app/checkout/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/checkout\"\nexec \"$CURDIR/bin/checkout\"\n"
  },
  {
    "path": "gomall/app/checkout/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/email/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/app/email/biz/consumer/consumer.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage consumer\n\nimport \"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer/email\"\n\nfunc Init() {\n\temail.ConsumerInit()\n}\n"
  },
  {
    "path": "gomall/app/email/biz/consumer/email/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//\thttp://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/notify\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/nats-io/nats.go\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"google.golang.org/protobuf/proto\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc ConsumerInit() {\n\t// Connect to a server\n\n\ttracer := otel.Tracer(\"shop-nats-consumer\")\n\tsub, err := mq.Nc.Subscribe(\"email\", func(m *nats.Msg) {\n\t\tvar req email.EmailReq\n\t\terr := proto.Unmarshal(m.Data, &req)\n\t\tif err != nil {\n\t\t\tklog.Error(err)\n\t\t}\n\t\tnoopEmail := notify.NewNoopEmail()\n\t\t_ = noopEmail.Send(&req)\n\n\t\t// consumer otel\n\t\tctx := context.Background()\n\t\tctx = otel.GetTextMapPropagator().Extract(ctx, propagation.HeaderCarrier(m.Header))\n\t\t_, span := tracer.Start(ctx, \"shop-email-consumer\")\n\t\tdefer span.End()\n\t\t// consumer otel\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tserver.RegisterShutdownHook(func() {\n\t\tsub.Unsubscribe() //nolint:errcheck\n\t\tmq.Nc.Close()\n\t})\n}\n"
  },
  {
    "path": "gomall/app/email/biz/consumer/email/email_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//\thttp://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"testing\"\n)\n\nfunc TestEmailConsumer(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/app/email/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/app/email/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/email/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/email/biz/service/send.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\ntype SendService struct {\n\tctx context.Context\n} // NewSendService new SendService\nfunc NewSendService(ctx context.Context) *SendService {\n\treturn &SendService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SendService) Run(req *email.EmailReq) (resp *email.EmailResp, err error) {\n\t// Finish your business logic.\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/email/biz/service/send_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc TestSend_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewSendService(ctx)\n\t// init req and assert value\n\n\treq := &email.EmailReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/app/email/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"email\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/app/email/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/app/email/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8887\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/email/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8887\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/email/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8887\"\n  metrics_port: \":9997\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/email/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/app/email/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/email\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/common => ../../common\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.39.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.opentelemetry.io/otel v1.25.0\n\tgoogle.golang.org/protobuf v1.33.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/go-version v1.6.0 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 // indirect\n\tgithub.com/klauspost/compress v1.17.9 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.9 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/app/email/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=\ngithub.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nats-io/nats.go v1.39.1 h1:oTkfKBmz7W047vRxV762M67ZdXeOtUgvbBaNoQ+3PPk=\ngithub.com/nats-io/nats.go v1.39.1/go.mod h1:MgRb8oOdigA6cYpEPhXJuRVH6UE/V4jblJ2jQ27IXYM=\ngithub.com/nats-io/nkeys v0.4.9 h1:qe9Faq2Gxwi6RZnZMXfmGMZkg3afLLOtrU+gDZJ35b0=\ngithub.com/nats-io/nkeys v0.4.9/go.mod h1:jcMqs+FLG+W5YO36OX6wFIFcmpdAns+w1Wm6D3I/evE=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/app/email/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/service\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\n// EmailServiceImpl implements the last service interface defined in the IDL.\ntype EmailServiceImpl struct{}\n\n// Send implements the EmailServiceImpl interface.\nfunc (s *EmailServiceImpl) Send(ctx context.Context, req *email.EmailReq) (resp *email.EmailResp, err error) {\n\tresp, err = service.NewSendService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/app/email/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(nats.DefaultURL)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/email/infra/notify/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage notify\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/kr/pretty\"\n)\n\ntype NoopEmail struct{}\n\nfunc (e *NoopEmail) Send(req *email.EmailReq) error {\n\tpretty.Printf(\"%v\", req)\n\treturn nil\n}\n\nfunc NewNoopEmail() NoopEmail {\n\treturn NoopEmail{}\n}\n"
  },
  {
    "path": "gomall/app/email/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'email'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/app/email/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"strings\"\n\n\t\"github.com/joho/godotenv\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\topts := kitexInit()\n\n\tmtl.InitLog(&lumberjack.Logger{\n\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t})\n\tmtl.InitTracing(serviceName)\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmq.Init()\n\tconsumer.Init()\n\tsvr := emailservice.NewServer(new(EmailServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddress := conf.GetConf().Kitex.Address\n\tif strings.HasPrefix(address, \":\") {\n\t\tlocalIp := utils.MustGetLocalIPv4()\n\t\taddress = localIp + address\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t_ = provider.NewOpenTelemetryProvider(\n\t\tprovider.WithSdkTracerProvider(mtl.TracerProvider),\n\t\tprovider.WithEnableMetrics(false),\n\t)\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/email/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/app/email/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/email\"\nexec \"$CURDIR/bin/email\"\n"
  },
  {
    "path": "gomall/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\ntmp\n.env\n"
  },
  {
    "path": "gomall/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/about/about_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage about\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// About .\n// @router /about [POST]\nfunc About(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewAboutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"about\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/about/about_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage about\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestAbout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/about\", About)\n\tpath := \"/about\"                                          // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(resp))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect := \"/\"\n\n\tc.Redirect(consts.StatusFound, []byte(redirect))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/cart/cart_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// AddCartItem .\n// @router /cart [POST]\nfunc AddCartItem(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req cart.AddCartReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\t_, err = service.NewAddCartItemService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(\"/cart\"))\n}\n\n// GetCart .\n// @router /cart [GET]\nfunc GetCart(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetCartService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/cart/cart_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestAddCartItem(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/cart\", AddCartItem)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestGetCart(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/cart\", GetCart)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/category/category_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Category .\n// @router /category/:category [GET]\nfunc Category(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req category.CategoryReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewCategoryService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"category\", resp)\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/category/category_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCategory(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/category/:category\", Category)\n\tpath := \"/category/:category\"                             // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/checkout/checkout_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Checkout .\n// @router /checkout [GET]\nfunc Checkout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutWaiting .\n// @router /checkout/waiting [POST]\nfunc CheckoutWaiting(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutWaitingService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutResult .\n// @router /checkout/result [GET]\nfunc CheckoutResult(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutResultService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"result\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/checkout/checkout_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCheckout(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout\", Checkout)\n\tpath := \"/checkout\"                                       // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutWaiting(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/checkout/waiting\", CheckoutWaiting)\n\tpath := \"/checkout/waiting\"                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutResult(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout/result\", CheckoutResult)\n\tpath := \"/checkout/result\"                                // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t// resp, err :=\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/order/order_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// OrderList .\n// @router /order [GET]\nfunc OrderList(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewOrderListService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"order\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"order\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/order/order_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestOrderList(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/order\", OrderList)\n\tpath := \"/order\"                                          // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/product/product_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetProduct .\n// @router /product [GET]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.ProductReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetProductService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"product\", utils.WarpResponse(ctx, c, resp))\n}\n\n// SearchProducs .\n// @router /search [GET]\nfunc SearchProducs(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.SearchProductsReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewSearchProducsService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"search\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/handler/product/product_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetProduct(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/product\", GetProduct)\n\tpath := \"/product\"                                        // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestSearchProducs(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/search\", SearchProducs)\n\tpath := \"/search\"                                         // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/about/about.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage about\n\nimport (\n\tabout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/about\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.POST(\"/about\", append(_aboutMw(), about.About)...)\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/about/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage about\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _aboutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/cart/cart_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.POST(\"/cart\", append(_addcartitemMw(), cart.AddCartItem)...)\n\troot.GET(\"/cart\", append(_getcartMw(), cart.GetCart)...)\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/cart/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage cart\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _addcartitemMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getcartMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/category/category_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage category\n\nimport (\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/category\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_category := root.Group(\"/category\", _categoryMw()...)\n\t\t_category.GET(\"/:category\", append(_category0Mw(), category.Category)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/category/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage category\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _categoryMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _category0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/checkout/checkout_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/checkout\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/checkout\", append(_checkout0Mw(), checkout.Checkout)...)\n\t_checkout := root.Group(\"/checkout\", _checkoutMw()...)\n\t_checkout.GET(\"/result\", append(_checkoutresultMw(), checkout.CheckoutResult)...)\n\t_checkout.POST(\"/waiting\", append(_checkoutwaitingMw(), checkout.CheckoutWaiting)...)\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/checkout/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage checkout\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _checkoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkout0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutresultMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutwaitingMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/order/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage order\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _orderlistMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/order/order_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage order\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/order\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/order\", append(_orderlistMw(), order.OrderList)...)\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/product/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage product\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getproductMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _searchproducsMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/product/product_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage product\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/product\", append(_getproductMw(), product.GetProduct)...)\n\troot.GET(\"/search\", append(_searchproducsMw(), product.SearchProducs)...)\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tabout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/about\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/cart\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/category\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/checkout\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/order\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\tabout.Register(r)\n\n\torder.Register(r)\n\n\tcheckout.Register(r)\n\n\tauth.Register(r)\n\n\tcart.Register(r)\n\n\tcategory.Register(r)\n\n\tproduct.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/about.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype AboutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewAboutService(Context context.Context, RequestContext *app.RequestContext) *AboutService {\n\treturn &AboutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *AboutService) Run(req *common.Empty) (resp map[string]any, err error) {\n\treturn utils.H{\n\t\t\"title\": \"About\",\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/add_cart_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype AddCartItemService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewAddCartItemService(Context context.Context, RequestContext *app.RequestContext) *AddCartItemService {\n\treturn &AddCartItemService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *AddCartItemService) Run(req *cart.AddCartReq) (resp *common.Empty, err error) {\n\t_, err = rpc.CartClient.AddItem(h.Context, &rpccart.AddItemReq{\n\t\tUserId: frontendutils.GetUserIdFromCtx(h.Context),\n\t\tItem: &rpccart.CartItem{\n\t\t\tProductId: req.ProductId,\n\t\t\tQuantity:  req.ProductNum,\n\t\t},\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CategoryService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCategoryService(Context context.Context, RequestContext *app.RequestContext) *CategoryService {\n\treturn &CategoryService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CategoryService) Run(req *category.CategoryReq) (resp map[string]any, err error) {\n\tp, _ := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{CategoryName: req.Category})\n\treturn utils.H{\n\t\t\"title\": \"Category\",\n\t\t\"items\": p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutService(Context context.Context, RequestContext *app.RequestContext) *CheckoutService {\n\treturn &CheckoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.ProductId})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":    p.Name,\n\t\t\t\"Price\":   strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\": p.Picture,\n\t\t\t\"Qty\":     strconv.Itoa(int(v.Quantity)),\n\t\t})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"Checkout\",\n\t\t\"items\":    items,\n\t\t\"cart_num\": len(items),\n\t\t\"total\":    strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/checkout_result.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype CheckoutResultService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutResultService(Context context.Context, RequestContext *app.RequestContext) *CheckoutResultService {\n\treturn &CheckoutResultService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutResultService) Run(req *common.Empty) (resp map[string]any, err error) {\n\treturn utils.H{}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/checkout_waiting.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\trpcpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutWaitingService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutWaitingService(Context context.Context, RequestContext *app.RequestContext) *CheckoutWaitingService {\n\treturn &CheckoutWaitingService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutWaitingService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\t_, err = rpc.CheckoutClient.Checkout(h.Context, &rpccheckout.CheckoutReq{\n\t\tUserId:    userId,\n\t\tEmail:     req.Email,\n\t\tFirstname: req.Firstname,\n\t\tLastname:  req.Lastname,\n\t\tAddress: &rpccheckout.Address{\n\t\t\tCountry:       req.Country,\n\t\t\tZipCode:       req.Zipcode,\n\t\t\tCity:          req.City,\n\t\t\tState:         req.Province,\n\t\t\tStreetAddress: req.Street,\n\t\t},\n\t\tCreditCard: &rpcpayment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CardNum,\n\t\t\tCreditCardExpirationYear:  req.ExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.ExpirationMonth,\n\t\t\tCreditCardCvv:             req.Cvv,\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"waiting\",\n\t\t\"redirect\": \"/checkout/result\",\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetCartService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetCartService(Context context.Context, RequestContext *app.RequestContext) *GetCartService {\n\treturn &GetCartService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetCartService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{\n\t\tUserId: uint32(h.Context.Value(frontendutils.UserIdKey).(float64)),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.GetProductId()})\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\"Name\": p.Name, \"Description\": p.Description, \"Picture\": p.Picture, \"Price\": strconv.FormatFloat(float64(p.Price), 'f', 2, 64), \"Qty\": strconv.Itoa(int(v.Quantity))})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Cart\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetProductService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetProductService(Context context.Context, RequestContext *app.RequestContext) *GetProductService {\n\treturn &GetProductService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetProductService) Run(req *product.ProductReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: req.GetId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"item\": p.Product,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (res map[string]any, err error) {\n\tctx := h.Context\n\tp, err := rpc.ProductClient.ListProducts(ctx, &product.ListProductsReq{})\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n\tvar cartNum int\n\treturn utils.H{\n\t\t\"title\":    \"Hot sale\",\n\t\t\"cart_num\": cartNum,\n\t\t\"items\":    p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (resp string, err error) {\n\tres, err := rpc.UserClient.Login(h.Context, &rpcuser.LoginReq{Email: req.Email, Password: req.Password})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\tfrontendutils.MustHandleError(err)\n\tredirect := \"/\"\n\tif frontendutils.ValidateNext(req.Next) {\n\t\tredirect = req.Next\n\t}\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn redirect, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\tsession.Save() //nolint:errcheck\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/order_list.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/types\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcorder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype OrderListService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewOrderListService(Context context.Context, RequestContext *app.RequestContext) *OrderListService {\n\treturn &OrderListService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *OrderListService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\tvar orders []*types.Order\n\tlistOrderResp, err := rpc.OrderClient.ListOrder(h.Context, &rpcorder.ListOrderReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif listOrderResp == nil || len(listOrderResp.Orders) == 0 {\n\t\treturn utils.H{\n\t\t\t\"title\":  \"Order\",\n\t\t\t\"orders\": orders,\n\t\t}, nil\n\t}\n\n\tfor _, v := range listOrderResp.Orders {\n\t\tvar items []types.OrderItem\n\t\tvar total float32\n\t\tif len(v.OrderItems) > 0 {\n\t\t\tfor _, vv := range v.OrderItems {\n\t\t\t\ttotal += vv.Cost\n\t\t\t\ti := vv.Item\n\t\t\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: i.ProductId})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif productResp.Product == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tp := productResp.Product\n\t\t\t\titems = append(items, types.OrderItem{\n\t\t\t\t\tProductId:   i.ProductId,\n\t\t\t\t\tQty:         uint32(i.Quantity),\n\t\t\t\t\tProductName: p.Name,\n\t\t\t\t\tPicture:     p.Picture,\n\t\t\t\t\tCost:        vv.Cost,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\ttimeObj := time.Unix(int64(v.CreatedAt), 0)\n\t\torders = append(orders, &types.Order{\n\t\t\tCost:        total,\n\t\t\tItems:       items,\n\t\t\tCreatedDate: timeObj.Format(\"2006-01-02 15:04:05\"),\n\t\t\tOrderId:     v.OrderId,\n\t\t\tConsignee:   types.Consignee{Email: v.Email},\n\t\t})\n\t}\n\n\treturn utils.H{\n\t\t\"title\":  \"Order\",\n\t\t\"orders\": orders,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\tres, err := rpc.UserClient.Register(h.Context, &rpcuser.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tConfirmPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/service/search_producs.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype SearchProducsService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewSearchProducsService(Context context.Context, RequestContext *app.RequestContext) *SearchProducsService {\n\treturn &SearchProducsService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *SearchProducsService) Run(req *product.SearchProductsReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.SearchProducts(h.Context, &rpcproduct.SearchProductsReq{Query: req.Q})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"items\": p.Results,\n\t\t\"q\":     req.Q,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tvar cartNum int\n\tuserId := frontendutils.GetUserIdFromCtx(ctx)\n\tcartResp, _ := rpc.CartClient.GetCart(ctx, &cart.GetCartReq{UserId: userId})\n\tif cartResp != nil && cartResp.Cart != nil {\n\t\tcartNum = len(cartResp.Cart.Items)\n\t}\n\tcontent[\"user_id\"] = ctx.Value(frontendutils.UserIdKey)\n\tcontent[\"cart_num\"] = cartNum\n\treturn content\n}\n"
  },
  {
    "path": "gomall/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     int    `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/common => ../../common\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.7.3\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/hashicorp/consul/api v1.26.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b\n\tgithub.com/hertz-contrib/logger/zap v1.1.0\n\tgithub.com/hertz-contrib/monitor-prometheus v0.1.2\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3\n\tgithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1\n\tgithub.com/hertz-contrib/pprof v0.1.1\n\tgithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/prometheus/client_golang v1.19.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.opentelemetry.io/otel v1.25.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0\n\tgo.opentelemetry.io/otel/sdk v1.25.0\n\tgo.opentelemetry.io/otel/trace v1.25.0\n\tgo.uber.org/zap v1.27.0\n\tgoogle.golang.org/protobuf v1.33.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/andeya/ameda v1.5.3 // indirect\n\tgithub.com/andeya/goutil v1.0.1 // indirect\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.11 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.7.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/go-version v1.6.0 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.3.0 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/andeya/ameda v1.5.3 h1:SvqnhQPZwwabS8HQTRGfJwWPl2w9ZIPInHAw9aE1Wlk=\ngithub.com/andeya/ameda v1.5.3/go.mod h1:FQDHRe1I995v6GG+8aJ7UIUToEmbdTJn/U26NCPIgXQ=\ngithub.com/andeya/goutil v1.0.1 h1:eiYwVyAnnK0dXU5FJsNjExkJW4exUGn/xefPt3k4eXg=\ngithub.com/andeya/goutil v1.0.1/go.mod h1:jEG5/QnnhG7yGxwFUX6Q+JGMif7sjdHmmNVjn7nhJDo=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11 h1:jJgmoDKPKacGl0llPYbYL/+/2N+Ng0vV0ipbnVssXHY=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11/go.mod h1:UAyKh4ZRLBPGsyTRFZoPqTni1TlojMdOJXQnEIPCX84=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.3.5/go.mod h1:V973WhNhGmvHxW6nQmsHEfHaoU9F3zTF+93rH03hcUQ=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.3.2/go.mod h1:hnv3B7eZ6kMv7CKFHT2OC4LU0mA4s5XPyu/SbixLcrU=\ngithub.com/cloudwego/hertz v0.6.0/go.mod h1:83EedHQvCXpveYh2r9us8YlQ1C28vPg93wPdB/QpJiA=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.2.6/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=\ngithub.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.15.0/go.mod h1:bcaw5CSZ7NE9qfOfKCI1xb7ZKjzu/MyvQkCLTfqLqxQ=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.10.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b h1:RoBp+TurP+46VZl31VMV+6wO2SlNlXwyVwjc93s5/tI=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/zap v1.1.0 h1:4efINiIDJrXEtAFeEdDJvc3Hye0VFxp+0X4BwaZgxNs=\ngithub.com/hertz-contrib/logger/zap v1.1.0/go.mod h1:D/rJJgsYn+SGaHVfVqWS3vHTbbc7ODAlJO+6smWgTeE=\ngithub.com/hertz-contrib/monitor-prometheus v0.1.2 h1:MYZGi4uStLtHKUm7+kc/ljbxzUTDE9H5FPCTSB/p7ZM=\ngithub.com/hertz-contrib/monitor-prometheus v0.1.2/go.mod h1:aUP6t5bK8msuf+5dN/k8099IjD0u8s9A6vrYWQ+yzN0=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1 h1:N/rbPCZgrupBNjTEe8Cq+cnTOpgj/y4SU6MYe6uQl0g=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1/go.mod h1:oEnsG4CpBuLx1vcCnxpE/MsNHUrF4qQKw8DiOdtdBa0=\ngithub.com/hertz-contrib/pprof v0.1.1 h1:x7kOFUtqkveXbDbiISIFE3x02cAtcb6/DBjHgsJmYcM=\ngithub.com/hertz-contrib/pprof v0.1.1/go.mod h1:9g23VQrcC4AjW++VA2relquyMXPVfs/s+t5FBIjIIOs=\ngithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b h1:DIfogbZyBmOYUkkS0jGDNT03jqVPtHypQrZ0mhcASUE=\ngithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b/go.mod h1:bjNZ+0osz/GmRMEXZAMeme+qE7WV6g4DEtX/TdfXzvo=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/nyaruka/phonenumbers v1.3.0 h1:IFyyJfF2Elg8xGKFghWrRXzb6qAHk+Q3uPqmIgS20JQ=\ngithub.com/nyaruka/phonenumbers v1.3.0/go.mod h1:4jyKp/BFUokLbCHyoZag+T3S1KezFVoEKtgnbpzItC4=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50732,\n\t\tName:          \"api.service_path\",\n\t\tTag:           \"bytes,50732,opt,name=service_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is\n\t// generated, with a higher priority than api_version\n\t//\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the\n\t// client code is generated\n\t//\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n\t// optional string service_path = 50732;\n\tE_ServicePath = &file_api_proto_extTypes[37]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[38]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x47, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xac, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a,\n\t0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t3,  // 37: api.service_path:extendee -> google.protobuf.ServiceOptions\n\t4,  // 38: api.reserve:extendee -> google.protobuf.MessageOptions\n\t39, // [39:39] is the sub-list for method output_type\n\t39, // [39:39] is the sub-list for method input_type\n\t39, // [39:39] is the sub-list for extension type_name\n\t0,  // [0:39] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 39,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/frontend/about/about.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: about.proto\n\npackage about\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_about_proto protoreflect.FileDescriptor\n\nvar file_about_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x1a, 0x15, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,\n\t0x53, 0x0a, 0x0c, 0x41, 0x62, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x43, 0x0a, 0x05, 0x41, 0x62, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,\n\t0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0a, 0xd2, 0xc1, 0x18, 0x06, 0x2f, 0x61,\n\t0x62, 0x6f, 0x75, 0x74, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x69, 0x79, 0x75, 0x74, 0x61, 0x6e, 0x67, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar file_about_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_about_proto_depIdxs = []int32{\n\t0, // 0: frontend.about.AboutService.About:input_type -> frontend.common.Empty\n\t0, // 1: frontend.about.AboutService.About:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_about_proto_init() }\nfunc file_about_proto_init() {\n\tif File_about_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_about_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_about_proto_goTypes,\n\t\tDependencyIndexes: file_about_proto_depIdxs,\n\t}.Build()\n\tFile_about_proto = out.File\n\tfile_about_proto_rawDesc = nil\n\tfile_about_proto_goTypes = nil\n\tfile_about_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\" form:\"confirm_password\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52,\n\t0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a,\n\t0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb, 0x18, 0x10, 0x63, 0x6f, 0x6e,\n\t0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x73,\n\t0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2,\n\t0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x04, 0x6e,\n\t0x65, 0x78, 0x74, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12,\n\t0x1a, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e,\n\t0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x22, 0x12, 0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72,\n\t0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x12, 0x17, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0f, 0xd2, 0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x42,\n\t0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x69,\n\t0x79, 0x75, 0x74, 0x61, 0x6e, 0x67, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70,\n\t0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a,\n\t0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75,\n\t0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: frontend.auth.RegisterReq\n\t(*LoginReq)(nil),     // 1: frontend.auth.LoginReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t1, // 1: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/frontend/cart/cart_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: cart_page.proto\n\npackage cart\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AddCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId  uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\" form:\"productId\"`\n\tProductNum int32  `protobuf:\"varint,2,opt,name=product_num,json=productNum,proto3\" json:\"product_num,omitempty\" form:\"productNum\"`\n}\n\nfunc (x *AddCartReq) Reset() {\n\t*x = AddCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddCartReq) ProtoMessage() {}\n\nfunc (x *AddCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddCartReq.ProtoReflect.Descriptor instead.\nfunc (*AddCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AddCartReq) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *AddCartReq) GetProductNum() int32 {\n\tif x != nil {\n\t\treturn x.ProductNum\n\t}\n\treturn 0\n}\n\nvar File_cart_page_proto protoreflect.FileDescriptor\n\nvar file_cart_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x6b, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71,\n\t0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x42, 0x0d, 0xe2, 0xbb, 0x18, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x49, 0x64, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x2f,\n\t0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x05, 0x42, 0x0e, 0xe2, 0xbb, 0x18, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x4e, 0x75, 0x6d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x32,\n\t0xa0, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x4b, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x19,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x09, 0xd2, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,\n\t0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x09, 0xca, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61,\n\t0x72, 0x74, 0x42, 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x62, 0x61, 0x69, 0x79, 0x75, 0x74, 0x61, 0x6e, 0x67, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c,\n\t0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68,\n\t0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_page_proto_rawDescOnce sync.Once\n\tfile_cart_page_proto_rawDescData = file_cart_page_proto_rawDesc\n)\n\nfunc file_cart_page_proto_rawDescGZIP() []byte {\n\tfile_cart_page_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_page_proto_rawDescData)\n\t})\n\treturn file_cart_page_proto_rawDescData\n}\n\nvar file_cart_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_cart_page_proto_goTypes = []interface{}{\n\t(*AddCartReq)(nil),   // 0: frontend.cart.AddCartReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_cart_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.cart.CartService.AddCartItem:input_type -> frontend.cart.AddCartReq\n\t1, // 1: frontend.cart.CartService.GetCart:input_type -> frontend.common.Empty\n\t1, // 2: frontend.cart.CartService.AddCartItem:output_type -> frontend.common.Empty\n\t1, // 3: frontend.cart.CartService.GetCart:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_page_proto_init() }\nfunc file_cart_page_proto_init() {\n\tif File_cart_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_page_proto_goTypes,\n\t\tDependencyIndexes: file_cart_page_proto_depIdxs,\n\t\tMessageInfos:      file_cart_page_proto_msgTypes,\n\t}.Build()\n\tFile_cart_page_proto = out.File\n\tfile_cart_page_proto_rawDesc = nil\n\tfile_cart_page_proto_goTypes = nil\n\tfile_cart_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/frontend/category/category_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: category_page.proto\n\npackage category\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CategoryReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory string `protobuf:\"bytes,1,opt,name=category,proto3\" json:\"category,omitempty\" path:\"category\"`\n}\n\nfunc (x *CategoryReq) Reset() {\n\t*x = CategoryReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_category_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryReq) ProtoMessage() {}\n\nfunc (x *CategoryReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_category_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryReq.ProtoReflect.Descriptor instead.\nfunc (*CategoryReq) Descriptor() ([]byte, []int) {\n\treturn file_category_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CategoryReq) GetCategory() string {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn \"\"\n}\n\nvar File_category_page_proto protoreflect.FileDescriptor\n\nvar file_category_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x08, 0x63, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xd2, 0xbb, 0x18,\n\t0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x32, 0x6e, 0x0a, 0x0f, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13,\n\t0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2f, 0x3a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x42, 0x4f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d,\n\t0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_category_page_proto_rawDescOnce sync.Once\n\tfile_category_page_proto_rawDescData = file_category_page_proto_rawDesc\n)\n\nfunc file_category_page_proto_rawDescGZIP() []byte {\n\tfile_category_page_proto_rawDescOnce.Do(func() {\n\t\tfile_category_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_category_page_proto_rawDescData)\n\t})\n\treturn file_category_page_proto_rawDescData\n}\n\nvar file_category_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_category_page_proto_goTypes = []interface{}{\n\t(*CategoryReq)(nil),  // 0: frontend.category.CategoryReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_category_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.category.CategoryService.Category:input_type -> frontend.category.CategoryReq\n\t1, // 1: frontend.category.CategoryService.Category:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_category_page_proto_init() }\nfunc file_category_page_proto_init() {\n\tif File_category_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_category_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_category_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_category_page_proto_goTypes,\n\t\tDependencyIndexes: file_category_page_proto_depIdxs,\n\t\tMessageInfos:      file_category_page_proto_msgTypes,\n\t}.Build()\n\tFile_category_page_proto = out.File\n\tfile_category_page_proto_rawDesc = nil\n\tfile_category_page_proto_goTypes = nil\n\tfile_category_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/frontend/checkout/checkout_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: checkout_page.proto\n\npackage checkout\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tFirstname       string `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\" form:\"firstname\"`\n\tLastname        string `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\" form:\"lastname\"`\n\tStreet          string `protobuf:\"bytes,4,opt,name=street,proto3\" json:\"street,omitempty\" form:\"street\"`\n\tZipcode         string `protobuf:\"bytes,5,opt,name=zipcode,proto3\" json:\"zipcode,omitempty\" form:\"zipcode\"`\n\tProvince        string `protobuf:\"bytes,6,opt,name=province,proto3\" json:\"province,omitempty\" form:\"province\"`\n\tCountry         string `protobuf:\"bytes,7,opt,name=country,proto3\" json:\"country,omitempty\" form:\"country\"`\n\tCity            string `protobuf:\"bytes,8,opt,name=city,proto3\" json:\"city,omitempty\" form:\"city\"`\n\tCardNum         string `protobuf:\"bytes,9,opt,name=card_num,json=cardNum,proto3\" json:\"card_num,omitempty\" form:\"cardNum\"`\n\tExpirationMonth int32  `protobuf:\"varint,10,opt,name=expiration_month,json=expirationMonth,proto3\" json:\"expiration_month,omitempty\" form:\"expirationMonth\"`\n\tExpirationYear  int32  `protobuf:\"varint,11,opt,name=expiration_year,json=expirationYear,proto3\" json:\"expiration_year,omitempty\" form:\"expirationYear\"`\n\tCvv             int32  `protobuf:\"varint,12,opt,name=cvv,proto3\" json:\"cvv,omitempty\" form:\"cvv\"`\n\tPayment         string `protobuf:\"bytes,13,opt,name=payment,proto3\" json:\"payment,omitempty\" form:\"payment\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetStreet() string {\n\tif x != nil {\n\t\treturn x.Street\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetZipcode() string {\n\tif x != nil {\n\t\treturn x.Zipcode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCardNum() string {\n\tif x != nil {\n\t\treturn x.CardNum\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationMonth\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetCvv() int32 {\n\tif x != nil {\n\t\treturn x.Cvv\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetPayment() string {\n\tif x != nil {\n\t\treturn x.Payment\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_page_proto protoreflect.FileDescriptor\n\nvar file_checkout_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa6, 0x04, 0x0a, 0x0b, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d,\n\t0xe2, 0xbb, 0x18, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x0a, 0xe2, 0xbb, 0x18, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x52, 0x06,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x7a, 0x69, 0x70,\n\t0x63, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a,\n\t0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70,\n\t0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x63, 0x6f,\n\t0x75, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c,\n\t0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xe2, 0xbb,\n\t0x18, 0x04, 0x63, 0x69, 0x74, 0x79, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x08,\n\t0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b,\n\t0xe2, 0xbb, 0x18, 0x07, 0x63, 0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x52, 0x07, 0x63, 0x61, 0x72,\n\t0x64, 0x4e, 0x75, 0x6d, 0x12, 0x3e, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13,\n\t0xe2, 0xbb, 0x18, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f,\n\t0x6e, 0x74, 0x68, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x6f, 0x6e, 0x74, 0x68, 0x12, 0x3b, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, 0xe2,\n\t0xbb, 0x18, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x12, 0x19, 0x0a, 0x03, 0x63, 0x76, 0x76, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xe2, 0xbb, 0x18, 0x03, 0x63, 0x76, 0x76, 0x52, 0x03, 0x63, 0x76, 0x76, 0x12, 0x25, 0x0a, 0x07,\n\t0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2,\n\t0xbb, 0x18, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x32, 0x96, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x6f, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0d, 0xca, 0xc1, 0x18,\n\t0x09, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x58, 0x0a, 0x0f, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,\n\t0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0xd2,\n\t0xc1, 0x18, 0x11, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x77, 0x61, 0x69,\n\t0x74, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0xca, 0xc1, 0x18, 0x10, 0x2f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x46, 0x5a, 0x44,\n\t0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x69, 0x79, 0x75,\n\t0x74, 0x61, 0x6e, 0x67, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x68, 0x65, 0x63,\n\t0x6b, 0x6f, 0x75, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_page_proto_rawDescOnce sync.Once\n\tfile_checkout_page_proto_rawDescData = file_checkout_page_proto_rawDesc\n)\n\nfunc file_checkout_page_proto_rawDescGZIP() []byte {\n\tfile_checkout_page_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_page_proto_rawDescData)\n\t})\n\treturn file_checkout_page_proto_rawDescData\n}\n\nvar file_checkout_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_checkout_page_proto_goTypes = []interface{}{\n\t(*CheckoutReq)(nil),  // 0: frontend.checkout.CheckoutReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_checkout_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.checkout.CheckoutService.Checkout:input_type -> frontend.checkout.CheckoutReq\n\t1, // 1: frontend.checkout.CheckoutService.CheckoutWaiting:input_type -> frontend.common.Empty\n\t1, // 2: frontend.checkout.CheckoutService.CheckoutResult:input_type -> frontend.common.Empty\n\t1, // 3: frontend.checkout.CheckoutService.Checkout:output_type -> frontend.common.Empty\n\t1, // 4: frontend.checkout.CheckoutService.CheckoutWaiting:output_type -> frontend.common.Empty\n\t1, // 5: frontend.checkout.CheckoutService.CheckoutResult:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_page_proto_init() }\nfunc file_checkout_page_proto_init() {\n\tif File_checkout_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_page_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_page_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_page_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_page_proto = out.File\n\tfile_checkout_page_proto_rawDesc = nil\n\tfile_checkout_page_proto_goTypes = nil\n\tfile_checkout_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Base struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTitle  string `protobuf:\"bytes,1,opt,name=title,proto3\" json:\"title,omitempty\" form:\"title\" query:\"title\"`\n\tUserId uint32 `protobuf:\"varint,2,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\" form:\"user_id\" query:\"user_id\"`\n}\n\nfunc (x *Base) Reset() {\n\t*x = Base{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Base) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Base) ProtoMessage() {}\n\nfunc (x *Base) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Base.ProtoReflect.Descriptor instead.\nfunc (*Base) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Base) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Base) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{1}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x04, 0x42, 0x61, 0x73, 0x65,\n\t0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69,\n\t0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22,\n\t0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68,\n\t0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f,\n\t0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c,\n\t0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65,\n\t0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Base)(nil),  // 0: frontend.common.Base\n\t(*Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Base); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_frontend_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x09, 0x61,\n\t0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,\n\t0x4c, 0x0a, 0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d,\n\t0x0a, 0x04, 0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x42, 0x5a,\n\t0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x69, 0x79,\n\t0x75, 0x74, 0x61, 0x6e, 0x67, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d,\n\t0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.common.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.common.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/frontend/order/order_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: order_page.proto\n\npackage order\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_order_page_proto protoreflect.FileDescriptor\n\nvar file_order_page_proto_rawDesc = []byte{\n\t0x0a, 0x10, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x32, 0x57, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x73,\n\t0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0a, 0xca, 0xc1, 0x18, 0x06, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x43, 0x5a,\n\t0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x69, 0x79,\n\t0x75, 0x74, 0x61, 0x6e, 0x67, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_order_page_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_order_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.order.OrderService.OrderList:input_type -> frontend.common.Empty\n\t0, // 1: frontend.order.OrderService.OrderList:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_order_page_proto_init() }\nfunc file_order_page_proto_init() {\n\tif File_order_page_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_page_proto_goTypes,\n\t\tDependencyIndexes: file_order_page_proto_depIdxs,\n\t}.Build()\n\tFile_order_page_proto = out.File\n\tfile_order_page_proto_rawDesc = nil\n\tfile_order_page_proto_goTypes = nil\n\tfile_order_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/hertz_gen/frontend/product/product_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: product_page.proto\n\npackage product\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\" query:\"id\"`\n}\n\nfunc (x *ProductReq) Reset() {\n\t*x = ProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProductReq) ProtoMessage() {}\n\nfunc (x *ProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProductReq.ProtoReflect.Descriptor instead.\nfunc (*ProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQ string `protobuf:\"bytes,1,opt,name=q,proto3\" json:\"q,omitempty\" query:\"q\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *SearchProductsReq) GetQ() string {\n\tif x != nil {\n\t\treturn x.Q\n\t}\n\treturn \"\"\n}\n\nvar File_product_page_proto protoreflect.FileDescriptor\n\nvar file_product_page_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,\n\t0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x42, 0x06, 0xb2, 0xbb, 0x18, 0x02, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x22, 0x28,\n\t0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x12, 0x13, 0x0a, 0x01, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05,\n\t0xb2, 0xbb, 0x18, 0x01, 0x71, 0x52, 0x01, 0x71, 0x32, 0xbd, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x47,\n\t0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x0c, 0xca, 0xc1, 0x18, 0x08, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x59, 0x0a,\n\t0x0d, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x73, 0x12, 0x23,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0b, 0xca, 0xc1, 0x18,\n\t0x07, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68,\n\t0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f,\n\t0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c,\n\t0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65,\n\t0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_page_proto_rawDescOnce sync.Once\n\tfile_product_page_proto_rawDescData = file_product_page_proto_rawDesc\n)\n\nfunc file_product_page_proto_rawDescGZIP() []byte {\n\tfile_product_page_proto_rawDescOnce.Do(func() {\n\t\tfile_product_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_page_proto_rawDescData)\n\t})\n\treturn file_product_page_proto_rawDescData\n}\n\nvar file_product_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_product_page_proto_goTypes = []interface{}{\n\t(*ProductReq)(nil),        // 0: frontend.product.ProductReq\n\t(*SearchProductsReq)(nil), // 1: frontend.product.SearchProductsReq\n\t(*common.Empty)(nil),      // 2: frontend.common.Empty\n}\nvar file_product_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.product.ProductService.GetProduct:input_type -> frontend.product.ProductReq\n\t1, // 1: frontend.product.ProductService.SearchProducs:input_type -> frontend.product.SearchProductsReq\n\t2, // 2: frontend.product.ProductService.GetProduct:output_type -> frontend.common.Empty\n\t2, // 3: frontend.product.ProductService.SearchProducs:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_product_page_proto_init() }\nfunc file_product_page_proto_init() {\n\tif File_product_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_page_proto_goTypes,\n\t\tDependencyIndexes: file_product_page_proto_depIdxs,\n\t\tMessageInfos:      file_product_page_proto_msgTypes,\n\t}.Build()\n\tFile_product_page_proto = out.File\n\tfile_product_page_proto_rawDesc = nil\n\tfile_product_page_proto_goTypes = nil\n\tfile_product_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/app/frontend/infra/mtl/log.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/kitex/server\"\n\thertzzap \"github.com/hertz-contrib/logger/zap\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\"\n)\n\nfunc initLog() {\n\tvar opts []hertzzap.Option\n\tvar output zapcore.WriteSyncer\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\topts = append(opts, hertzzap.WithCoreEnc(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())))\n\t\toutput = os.Stdout\n\t} else {\n\t\topts = append(opts, hertzzap.WithCoreEnc(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())))\n\t\t// async log\n\t\toutput = &zapcore.BufferedWriteSyncer{\n\t\t\tWS:            zapcore.AddSync(os.Stdout),\n\t\t\tFlushInterval: time.Minute,\n\t\t}\n\t\tserver.RegisterShutdownHook(func() {\n\t\t\toutput.Sync() //nolint:errcheck\n\t\t})\n\t}\n\tlog := hertzzap.NewLogger(opts...)\n\thlog.SetLogger(log)\n\thlog.SetLevel(hlog.LevelInfo)\n\thlog.SetOutput(output)\n}\n"
  },
  {
    "path": "gomall/app/frontend/infra/mtl/metric.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/utils\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server/registry\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/route\"\n\tconsulapi \"github.com/hashicorp/consul/api\"\n\t\"github.com/hertz-contrib/registry/consul\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/collectors\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n)\n\nvar Registry *prometheus.Registry\n\nfunc initMetric() route.CtxCallback {\n\tRegistry = prometheus.NewRegistry()\n\tRegistry.MustRegister(collectors.NewGoCollector())\n\tRegistry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))\n\tconfig := consulapi.DefaultConfig()\n\tconfig.Address = conf.GetConf().Hertz.RegistryAddr\n\tconsulClient, _ := consulapi.NewClient(config)\n\tr := consul.NewConsulRegister(consulClient, consul.WithAdditionInfo(&consul.AdditionInfo{\n\t\tTags: []string{\"service:frontend\"},\n\t}))\n\n\tlocalIp := utils.MustGetLocalIPv4()\n\tip, err := net.ResolveTCPAddr(\"tcp\", fmt.Sprintf(\"%s:%d\", localIp, conf.GetConf().Hertz.MetricsPort))\n\tif err != nil {\n\t\thlog.Error(err)\n\t}\n\tregistryInfo := &registry.Info{Addr: ip, ServiceName: \"prometheus\", Weight: 1}\n\terr = r.Register(registryInfo)\n\tif err != nil {\n\t\thlog.Error(err)\n\t}\n\n\thttp.Handle(\"/metrics\", promhttp.HandlerFor(Registry, promhttp.HandlerOpts{}))\n\tgo http.ListenAndServe(fmt.Sprintf(\":%d\", conf.GetConf().Hertz.MetricsPort), nil) //nolint:errcheck\n\treturn func(ctx context.Context) {\n\t\tr.Deregister(registryInfo) //nolint:errcheck\n\t}\n}\n"
  },
  {
    "path": "gomall/app/frontend/infra/mtl/mtl.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/route\"\n)\n\nvar once sync.Once\n\nvar Hooks []route.CtxCallback\n\nfunc InitMtl() {\n\tonce.Do(\n\t\tfunc() {\n\t\t\tHooks = append(Hooks, InitTracing(), initMetric())\n\t\t\tinitLog()\n\t\t},\n\t)\n}\n"
  },
  {
    "path": "gomall/app/frontend/infra/mtl/tracing.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/route\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.17.0\"\n)\n\nvar TracerProvider *tracesdk.TracerProvider\n\nfunc InitTracing() route.CtxCallback {\n\texporter, err := otlptracegrpc.New(context.Background())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tprocessor := tracesdk.NewBatchSpanProcessor(exporter)\n\tres, err := resource.New(context.Background(), resource.WithAttributes(semconv.ServiceNameKey.String(utils.ServiceName)))\n\tif err != nil {\n\t\tres = resource.Default()\n\t}\n\tTracerProvider = tracesdk.NewTracerProvider(tracesdk.WithSpanProcessor(processor), tracesdk.WithResource(res))\n\totel.SetTracerProvider(TracerProvider)\n\n\treturn route.CtxCallback(func(ctx context.Context) {\n\t\texporter.Shutdown(ctx) //nolint:errcheck\n\t})\n}\n"
  },
  {
    "path": "gomall/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/mtl\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/circuitbreak\"\n\t\"github.com/cloudwego/kitex/pkg/fallback\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\tprometheus \"github.com/kitex-contrib/monitor-prometheus\"\n)\n\nvar (\n\tProductClient  productcatalogservice.Client\n\tUserClient     userservice.Client\n\tCartClient     cartservice.Client\n\tCheckoutClient checkoutservice.Client\n\tOrderClient    orderservice.Client\n\tonce           sync.Once\n\terr            error\n\tregistryAddr   string\n\tcommonSuite    client.Option\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tregistryAddr = conf.GetConf().Hertz.RegistryAddr\n\t\tcommonSuite = client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\t\tRegistryAddr:       registryAddr,\n\t\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\t})\n\t\tinitProductClient()\n\t\tinitUserClient()\n\t\tinitCartClient()\n\t\tinitCheckoutClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\n\tcbs := circuitbreak.NewCBSuite(func(ri rpcinfo.RPCInfo) string {\n\t\treturn circuitbreak.RPCInfo2Key(ri)\n\t})\n\tcbs.UpdateServiceCBConfig(\"shop-frontend/product/GetProduct\", circuitbreak.CBConfig{Enable: true, ErrRate: 0.5, MinSample: 2})\n\n\topts = append(opts, commonSuite, client.WithCircuitBreaker(cbs), client.WithFallback(fallback.NewFallbackPolicy(fallback.UnwrapHelper(func(ctx context.Context, req, resp interface{}, err error) (fbResp interface{}, fbErr error) {\n\t\tmethodName := rpcinfo.GetRPCInfo(ctx).To().Method()\n\t\tif err == nil {\n\t\t\treturn resp, err\n\t\t}\n\t\tif methodName != \"ListProducts\" {\n\t\t\treturn resp, err\n\t\t}\n\t\treturn &product.ListProductsResp{\n\t\t\tProducts: []*product.Product{\n\t\t\t\t{\n\t\t\t\t\tPrice:       6.6,\n\t\t\t\t\tId:          3,\n\t\t\t\t\tPicture:     \"/static/image/t-shirt.jpeg\",\n\t\t\t\t\tName:        \"T-Shirt\",\n\t\t\t\t\tDescription: \"CloudWeGo T-Shirt\",\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil\n\t}))))\n\topts = append(opts, client.WithTracer(prometheus.NewClientTracer(\"\", \"\", prometheus.WithDisableServer(true), prometheus.WithRegistry(mtl.Registry))))\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initUserClient() {\n\tUserClient, err = userservice.NewClient(\"user\", commonSuite)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tCartClient, err = cartservice.NewClient(\"cart\", commonSuite)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCheckoutClient() {\n\tCheckoutClient, err = checkoutservice.NewClient(\"checkout\", commonSuite)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tOrderClient, err = orderservice.NewClient(\"order\", commonSuite)\n\tfrontendutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzprom \"github.com/hertz-contrib/monitor-prometheus\"\n\thertzotelprovider \"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\thertzoteltracing \"github.com/hertz-contrib/obs-opentelemetry/tracing\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n\toteltrace \"go.opentelemetry.io/otel/trace\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\n\tmtl.InitMtl()\n\trpc.InitClient()\n\taddress := conf.GetConf().Hertz.Address\n\n\tp := hertzotelprovider.NewOpenTelemetryProvider(\n\t\thertzotelprovider.WithSdkTracerProvider(mtl.TracerProvider),\n\t\thertzotelprovider.WithEnableMetrics(false),\n\t)\n\tdefer p.Shutdown(context.Background())\n\ttracer, cfg := hertzoteltracing.NewServerTracer(hertzoteltracing.WithCustomResponseHandler(func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Header(\"shop-trace-id\", oteltrace.SpanFromContext(ctx).SpanContext().TraceID().String())\n\t}))\n\n\th := server.New(server.WithHostPorts(address), server.WithTracer(\n\t\thertzprom.NewServerTracer(\n\t\t\t\"\",\n\t\t\t\"\",\n\t\t\thertzprom.WithRegistry(mtl.Registry),\n\t\t\thertzprom.WithDisableServer(true),\n\t\t),\n\t),\n\t\ttracer,\n\t)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Delims(\"{{\", \"}}\")\n\n\th.Use(hertzoteltracing.ServerMiddleware(cfg))\n\tregisterMiddleware(h)\n\n\t// add a ping route to test\n\th.GET(\"/ping\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.JSON(consts.StatusOK, utils.H{\"ping\": \"pong\"})\n\t})\n\n\trouter.GeneratedRegister(h)\n\n\th.GET(\"sign-in\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-in\", utils.H{\n\t\t\t\"title\": \"Sign in\",\n\t\t\t\"next\":  c.Query(\"next\"),\n\t\t})\n\t})\n\th.GET(\"sign-up\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", utils.H{\n\t\t\t\"title\": \"Sign up\",\n\t\t})\n\t})\n\th.GET(\"/redirect\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"about\", utils.H{\n\t\t\t\"title\": \"Error\",\n\t\t})\n\t})\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\th.GET(\"/robots.txt\", func(ctx context.Context, c *app.RequestContext) {\n\t\t\tc.Data(consts.StatusOK, \"text/plain\", []byte(`User-agent: *\nDisallow: /`))\n\t\t})\n\t}\n\n\th.Static(\"/static\", \"./\")\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\n\tstore, err := redis.NewStore(100, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tstore.Options(sessions.Options{MaxAge: 86400, Path: \"/\"})\n\trs, err := redis.GetRedisStore(store)\n\tif err == nil {\n\t\trs.SetSerializer(sessions.JSONSerializer{})\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\th.OnShutdown = append(h.OnShutdown, mtl.Hooks...)\n\n\t// cores\n\th.Use(cors.Default())\n\tmiddleware.RegisterMiddleware(h)\n}\n"
  },
  {
    "path": "gomall/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tbyteRef := c.GetHeader(\"Referer\")\n\t\t\tref := string(byteRef)\n\t\t\tnext := \"/sign-in\"\n\t\t\tif ref != \"\" {\n\t\t\t\tif utils.ValidateNext(ref) {\n\t\t\t\t\tnext = fmt.Sprintf(\"%s?next=%s\", next, ref)\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.Redirect(302, []byte(next))\n\t\t\tc.Abort()\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc RegisterMiddleware(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/app/frontend/template/about.tmpl",
    "content": "{{ define \"about\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-end\">\n                  <img src=\"/static/image/logo.jpg\" class=\"col-lg-4 col-sm-12\" alt=\"...\">\n                    <p>This is a community driven project</p>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}\n"
  },
  {
    "path": "gomall/app/frontend/template/cart-num.tmpl",
    "content": "{{define \"cart-num\"}}\n    <a href=\"/cart\" class=\"btn position-relative\">\n        <i class=\"fa-solid fa-cart-shopping\" style=\"font-size: 2rem\">\n        </i>\n        {{ if $.cart_num}}\n        <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\">\n    {{ $.cart_num }}\n            {{ end }}\n  </span>\n    </a>\n{{end}}"
  },
  {
    "path": "gomall/app/frontend/template/cart.tmpl",
    "content": "{{ define \"cart\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <ul class=\"list-group\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n        {{ if $.items }}\n            <div class=\"mt-3 mb-5\">\n                <div class=\"float-end\">\n                    <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                    <a href=\"/checkout\" class=\"btn btn-lg btn-success float-end\">Check out</a>\n                </div>\n            </div>\n        {{else}}\n            <h1 class=\"text-center text-danger\">Your Cart is empty</h1>\n            <div class=\"text-center\"><a href=\"/\">Shop Hot Sale</a></div>\n        {{ end }}\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/template/category.tmpl",
    "content": "{{ define \"category\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/template/checkout.tmpl",
    "content": "{{ define \"checkout\" }}\n    {{ template \"header\" . }}\n    <div class=\"row mb-5\">\n        <div class=\"col-lg-8 col-sm-12\">\n            <form method=\"post\" action=\"/checkout/waiting\">\n                <h4 class=\"mb-3 mt-3\">Contact</h4>\n                <label for=\"email\" class=\"form-label col-12\">\n                    <input class=\"form-control\" id=\"email\" type=\"email\" placeholder=\"Email\" name=\"email\"\n                           aria-label=\"email\" value=\"abc@example.com\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">Delivery</h4>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"firstname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"firstname\" class=\"form-control\" placeholder=\"First name\"\n                               name=\"firstname\" value=\"world\">\n                    </label>\n                    <label for=\"lastname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"lastname\" class=\"form-control\" placeholder=\"Last name\" name=\"lastname\"\n                               value=\"hello\">\n                    </label>\n                </div>\n                <label for=\"street\" class=\"mb-3 mt-3 col-12 form-label\">\n                    <input type=\"text\" class=\"form-control\" placeholder=\"Street\" name=\"street\" value=\"7th street\"\n                           id=\"street\">\n                </label>\n                <label for=\"zipcode\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"zipcode\" name=\"zipcode\" placeholder=\"zipcode\"\n                           value=\"310000\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"city\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"city\" class=\"form-control\" placeholder=\"City\" name=\"city\"\n                               value=\"hangzhou\">\n                    </label>\n                    <label for=\"province\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"province\" class=\"form-control\" name=\"province\" placeholder=\"Province\"\n                               value=\"zhejiang\">\n                    </label>\n                </div>\n                <label for=\"country\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"country\" name=\"country\" placeholder=\"Country\"\n                           value=\"china\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">\n                    Payment\n                </h4>\n                <label for=\"card-num\" class=\"form-label col-12\">\n                    <input type=\"text\" id=\"card-num\" class=\"form-control\" name=\"cardNum\" placeholder=\"Card number\"\n                           value=\"424242424242424242\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"expiration-month\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-month\" name=\"expirationMonth\" class=\"form-control\"\n                               placeholder=\"Expiration Month\" value=\"12\">\n                    </label>\n                    <label for=\"expiration-year\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-year\" name=\"expirationYear\" class=\"form-control\"\n                               placeholder=\"Expiration Year\" value=\"2030\">\n                    </label>\n                    <label for=\"cvv\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"cvv\" class=\"form-control\" name=\"cvv\" placeholder=\"cvv\" required>\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"card\" value=\"card\" checked>\n                    <label class=\"form-check-label\" for=\"card\">\n                        Card\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"stripe\" value=\"stripe\" disabled>\n                    <label class=\"form-check-label\" for=\"stripe\">\n                        Stripe\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"paypal\" value=\"paypal\" disabled>\n                    <label class=\"form-check-label\" for=\"paypal\">\n                        Paypal\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"wechat\" value=\"wechat\" disabled>\n                    <label class=\"form-check-label\" for=\"wechat\">\n                        Wechat\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"alipay\" value=\"alipay\" disabled>\n                    <label class=\"form-check-label\" for=\"alipay\">\n                        Alipay\n                    </label>\n                </div>\n                <div class=\"mt-3 mb-3\">\n                    <div class=\"float-end\">\n                        <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                        <input type=\"submit\" class=\"btn btn-success\" value=\"Pay\">\n                    </div>\n                </div>\n            </form>\n        </div>\n        <ul class=\"list-group col-lg-4 col-sm-12\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/template/error.tmpl",
    "content": "{{ define \"error\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div class='col-lg-2'></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-end\">\n                        <h5 class=\"card-title\">Error</h5>\n                        <p class=\"card-text\"> Somethine is error![{{ $.message }}]</p>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/template/footer.tmpl",
    "content": "{{ define \"footer\" }}\n\n    </div>\n    </main>\n    <footer class=\"py-5 bg-primary text-white\">\n        <div class=\"footer-top\">\n            <div class=\"container footer-social\">\n                <p>© 2023 CloudWeGo (<a class=\"text-white\"\n                                        href=\"https://github.com/cloudwego\">Source Code</a>)</p>\n            </div>\n        </div>\n    </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/js/all.min.js\"\n            integrity=\"sha512-GWzVrcGlo0TxTRvz9ttioyYJ+Wwk9Ck0G81D+eO63BaqHaJ3YZX9wuqjwgfcV/MrB2PhaVX9DkYVhbFpStnqpQ==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    </body>\n    </html>\n{{ end }}\n"
  },
  {
    "path": "gomall/app/frontend/template/header.tmpl",
    "content": "{{ define \"header\" }}\n    <!DOCTYPE html>\n    <html lang=\"en\">\n\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, shrink-to-fit=no\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n        {{ if $.redirect }}\n            <meta http-equiv=\"refresh\" content=\"5;url=/checkout/result\"/>\n        {{ end}}\n        <title>\n            CloudWeGo Shop\n        </title>\n        <link rel=\"stylesheet\" href=\"/static/css/bootstrap.min.css\">\n        <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n              integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n              crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n    </head>\n\n    <body class=\"min-vh-100\">\n    <header>\n        <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n            <div class=\"container\">\n                <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\"\n                        data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"/\">\n                    <img src=\"/static/image/logo.jpg\" style=\"height: 50px\" alt=\"\"> CloudWego Shop\n                </a>\n                <div class=\" ms-lg-3 d-block d-lg-none d-xl-none\">\n                    {{ template \"cart-num\" . }}\n                </div>\n                <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                    <ul class=\"navbar-nav mb-2 mb-lg-0 w-100\">\n                        <li class=\"nav-item dropdown\">\n                            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\"\n                               aria-expanded=\"false\">\n                                Categories\n                            </a>\n                            <ul class=\"dropdown-menu\">\n                                <li><a class=\"dropdown-item\" href=\"/category/t-shirt\">T-shirt</a></li>\n                                <li><a class=\"dropdown-item\" href=\"/category/sticker\">Sticker</a></li>\n                            </ul>\n                        </li>\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link\" href=\"/about\">About</a>\n                        </li>\n                        <form class=\"d-flex ms-auto\" role=\"search\" action=\"/search\" method=\"get\">\n                            <input class=\"form-control me-2\" type=\"search\" name=\"q\" placeholder=\"Search\"\n                                   aria-label=\"Search\" value=\"{{ .q }}\">\n                            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n                        </form>\n                        {{ if .user_id }}\n                            <div class=\"nav-item dropdown ms-3\">\n                                <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\"\n                                   aria-expanded=\"false\"><i class=\"fa-solid fa-user me-2\"></i>Hello</a>\n                                <ul class=\"dropdown-menu\">\n                                    <li><a class=\"dropdown-item\" href=\"/order\">Order Center</a></li>\n                                    <li>\n                                        <hr class=\"dropdown-divider\">\n                                    </li>\n                                    <li>\n                                        <form class=\"d-flex ms-auto\" action=\"/auth/logout\" method=\"post\">\n                                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                                        </form>\n                                    </li>\n                                </ul>\n                            </div>\n                        {{ else }}\n                            <div class=\"btn-group ms-3\" role=\"group\" aria-label=\"Basic mixed styles example\">\n                                <a href=\"/sign-in\" class=\"btn btn-primary\">Sign in</a>\n                            </div>\n                        {{ end }}\n                    </ul>\n                </div>\n                <div class=\"ms-lg-3 d-none d-lg-block d-xl-block\">\n                    {{ template \"cart-num\" . }}\n                </div>\n\n            </div>\n        </nav>\n        <div class=\"bg-primary text-center text-white pt-1 pb-1\">This website is hosted for demo purposes only. It is\n            not an\n            actual shop.\n        </div>\n        {{ if .error }}\n            <div class=\"alert alert-danger text-center\" role=\"alert\">{{ .error }}</div>\n         {{ end }}\n        {{ if .warning }}\n            <div class=\"alert alert-warning text-center\" role=\"alert\">{{ .warning }}</div>\n        {{ end }}\n    </header>\n    <main role=\"main\" class=\"home pt-5\" style=\"min-height:calc(100vh - 212px);\">\n        <div class=\"container\">\n            <h1 class=\"text-center\">{{ $.title }}</h1>\n{{end}}"
  },
  {
    "path": "gomall/app/frontend/template/home.tmpl",
    "content": "{{ define \"home\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items }}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}\n"
  },
  {
    "path": "gomall/app/frontend/template/order.tmpl",
    "content": "{{ define \"order\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n                    <div class=\"card-body row\">\n                        {{ range $.orders }}\n                        <div class=\"card\">\n                            <div class=\"card-body\">\n                              <h6 class=\"card-subtitle mb-2 text-muted\">{{.CreatedDate}} Order ID: {{.OrderId}}</h6>\n                              <ul class=\"list-group col-lg-12 col-sm-15\">\n                                {{ range .Items }}\n                                    <li class=\"list-group-item border-0\">\n                                        <div class=\"card border-0\">\n                                            <div class=\"card-body row\">\n                                                <div class=\"col-3\">\n                                                    <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                                                </div>\n                                                <div class=\"col-3\">\n                                                    <div class=\"mt-1\">{{ .ProductName }}</div>\n                                                </div>\n                                                <div class=\"col-2\">\n                                                    <div class=\"mt-1\">x {{ .Qty }}</div>\n                                                </div>\n                                                <div class=\"col-4\">\n                                                    <div class=\"mt-1\">Cost: {{ .Cost }}</div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </li>\n                                {{ end}}\n                            </ul>\n                            </div>\n                        </div>\n                        <p>\n                        {{ end}}\n                    </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/template/product.tmpl",
    "content": "{{ define \"product\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div id=\"productPicture\" class=\"carousel slide col-lg-6 col-sm-12\">\n                    <div class=\"carousel-indicators\">\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"0\"\n                                class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"1\"\n                                aria-label=\"Slide 2\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"2\"\n                                aria-label=\"Slide 3\"></button>\n                    </div>\n                    <div class=\"carousel-inner\">\n                        <div class=\"carousel-item active\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                    </div>\n                    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"prev\">\n                        <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Previous</span>\n                    </button>\n                    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"next\">\n                        <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Next</span>\n                    </button>\n                </div>\n                <div class=\"col-lg-1\"></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-center\">\n                    <form action=\"/cart\" method=\"post\">\n                        <h5 class=\"card-title\">{{ .item.Name }}</h5>\n                        <p class=\"card-text\">{{ .item.Description }}</p>\n                        <p class=\"card-text\">${{ .item.Price }}</p>\n                        <input type=\"hidden\" value=\"{{ .item.Id }}\" name=\"productId\">\n                        <label for=\"productNum\">数量：</label>\n                        <input type=\"number\" class=\"form-control mt-3\" id=\"productNum\" name=\"productNum\" value=\"1\"\n                               min=\"1\"/>\n                        <input type=\"submit\" class=\"btn btn-primary mt-3\" value=\"Add to Cart\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/template/result.tmpl",
    "content": "{{ define \"result\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <i class=\"fa-regular fa-circle-check fs-1 text-success\"></i>\n        <div class=\"text-center fs-3\">\n            Congratulations, you have successfully placed an order.\n        </div>\n    </div>\n    <div class=\"d-flex justify-content-center\">\n        <a href=\"/order\" class=\"btn btn-info\">Check Order</a>\n        <a href=\"/\" class=\"btn btn-success ms-5\">Back to Home</a>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/template/search.tmpl",
    "content": "{{ define \"search\" }}\n    {{ template \"header\" . }}\n    {{ if .q }}\n        <div class=\"d-inline-block border border-success rounded-4 p-1 ps-4 pe-4\">\n            <div>\n                {{ .q }}\n                <a href=\"/\" class=\"ps-4\">\n                    <button type=\"button\" class=\"btn btn-sm btn-danger\" aria-label=\"Close\">X</button>\n                </a>\n            </div>\n        </div>\n    {{ end}}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}\n"
  },
  {
    "path": "gomall/app/frontend/template/sign-in.tmpl",
    "content": "{{ define \"sign-in\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/login{{ if .next }}?next={{.next}} {{ end}}\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" required>\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\" required>\n            </div>\n            <div class=\"mb-3 form-check\">\n                <input type=\"checkbox\" class=\"form-check-input\" id=\"remember\">\n                <label class=\"form-check-label\" for=\"remember\">remember me</label>\n                <a href=\"\">Forget password?</a>\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign up</a>\n            </div>\n            <div class=\"mb-3\">\n                Login With <a href=\"\" style=\"color: black\"><i class=\"fa-brands fa-square-github\"\n                                                              style=\"font-size: 2rem\"></i></a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign in</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/template/sign-up.tmpl",
    "content": "{{ define \"sign-up\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" aria-describedby=\"emailHelp\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password-confirm\" class=\"form-label\">Password confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password-confirm\" name=\"password-confirm\">\n            </div>\n            <div class=\"mb-3\">\n                Already have account, click here to <a href=\"/sign-in\">Sign in</a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign up</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/template/utils.tmpl",
    "content": "{{ define \"required\" }}\n    <span class=\"text-danger\">*</span>\n{{end}}"
  },
  {
    "path": "gomall/app/frontend/template/waiting.tmpl",
    "content": "{{ define \"waiting\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <div class=\"text-danger h3 text-center mb-5\">\n            Wait a minutes, please don't close the window\n        </div>\n        <div class=\"spinner-grow text-primary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-secondary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-success\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-danger\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-warning\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-info\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-light\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-dark\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/app/frontend/types/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage types\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype Order struct {\n\tConsignee   Consignee\n\tOrderId     string\n\tCreatedDate string\n\tOrderState  string\n\tCost        float32\n\tItems       []OrderItem\n}\n\ntype OrderItem struct {\n\tProductId   uint32\n\tProductName string\n\tPicture     string\n\tQty         uint32\n\tCost        float32\n}\n"
  },
  {
    "path": "gomall/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"frontend\"\n\ntype SessionUserIdKey string\n\nconst UserIdKey = SessionUserIdKey(\"user_id\")\n"
  },
  {
    "path": "gomall/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) uint32 {\n\tif ctx.Value(UserIdKey) == nil {\n\t\treturn 0\n\t}\n\treturn uint32(ctx.Value(UserIdKey).(float64))\n}\n"
  },
  {
    "path": "gomall/app/frontend/utils/response.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/app/frontend/utils/safe.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"net/url\"\n\nvar validHost = []string{\n\t\"localhost:8080\",\n}\n\nfunc ValidateNext(next string) bool {\n\turlObj, err := url.Parse(next)\n\tif err != nil {\n\t\treturn false\n\t}\n\tif InArray(urlObj.Host, validHost) {\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/app/frontend/utils/strings.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nfunc InArray[T int | int32 | int64 | float32 | float64 | string](needle T, haystack []T) bool {\n\tfor _, k := range haystack {\n\t\tif needle == k {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/app/order/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/app/order/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/app/order/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Order{},\n\t\t\t&model.OrderItem{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/order/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/order/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/app/order/biz/model/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype OrderState string\n\nconst (\n\tOrderStatePlaced   OrderState = \"placed\"\n\tOrderStatePaid     OrderState = \"paid\"\n\tOrderStateCanceled OrderState = \"canceled\"\n)\n\ntype Order struct {\n\tBase\n\tOrderId      string `gorm:\"uniqueIndex;size:256\"`\n\tUserId       uint32\n\tUserCurrency string\n\tConsignee    Consignee   `gorm:\"embedded\"`\n\tOrderItems   []OrderItem `gorm:\"foreignKey:OrderIdRefer;references:OrderId\"`\n\tOrderState   OrderState\n}\n\nfunc (o Order) TableName() string {\n\treturn \"order\"\n}\n\nfunc ListOrder(db *gorm.DB, ctx context.Context, userId uint32) (orders []Order, err error) {\n\terr = db.Model(&Order{}).Where(&Order{UserId: userId}).Preload(\"OrderItems\").Find(&orders).Error\n\treturn\n}\n\nfunc GetOrder(db *gorm.DB, ctx context.Context, userId uint32, orderId string) (order Order, err error) {\n\terr = db.Where(&Order{UserId: userId, OrderId: orderId}).First(&order).Error\n\treturn\n}\n\nfunc UpdateOrderState(db *gorm.DB, ctx context.Context, userId uint32, orderId string, state OrderState) error {\n\treturn db.Model(&Order{}).Where(&Order{UserId: userId, OrderId: orderId}).Update(\"order_state\", state).Error\n}\n"
  },
  {
    "path": "gomall/app/order/biz/model/order_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\ntype OrderItem struct {\n\tBase\n\tProductId    uint32\n\tOrderIdRefer string `gorm:\"size:256;index\"`\n\tQuantity     int32\n\tCost         float32\n}\n\nfunc (oi OrderItem) TableName() string {\n\treturn \"order_item\"\n}\n"
  },
  {
    "path": "gomall/app/order/biz/service/list_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype ListOrderService struct {\n\tctx context.Context\n} // NewListOrderService new ListOrderService\nfunc NewListOrderService(ctx context.Context) *ListOrderService {\n\treturn &ListOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListOrderService) Run(req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\t// Finish your business logic.\n\torders, err := model.ListOrder(mysql.DB, s.ctx, req.UserId)\n\tif err != nil {\n\t\tklog.Errorf(\"model.ListOrder.err:%v\", err)\n\t\treturn nil, err\n\t}\n\tvar list []*order.Order\n\tfor _, v := range orders {\n\t\tvar items []*order.OrderItem\n\t\tfor _, v := range v.OrderItems {\n\t\t\titems = append(items, &order.OrderItem{\n\t\t\t\tCost: v.Cost,\n\t\t\t\tItem: &cart.CartItem{\n\t\t\t\t\tProductId: v.ProductId,\n\t\t\t\t\tQuantity:  v.Quantity,\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\to := &order.Order{\n\t\t\tOrderId:      v.OrderId,\n\t\t\tUserId:       v.UserId,\n\t\t\tUserCurrency: v.UserCurrency,\n\t\t\tEmail:        v.Consignee.Email,\n\t\t\tCreatedAt:    int32(v.CreatedAt.Unix()),\n\t\t\tAddress: &order.Address{\n\t\t\t\tCountry:       v.Consignee.Country,\n\t\t\t\tCity:          v.Consignee.City,\n\t\t\t\tStreetAddress: v.Consignee.StreetAddress,\n\t\t\t\tZipCode:       v.Consignee.ZipCode,\n\t\t\t},\n\t\t\tOrderItems: items,\n\t\t}\n\t\tlist = append(list, o)\n\t}\n\tresp = &order.ListOrderResp{\n\t\tOrders: list,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/order/biz/service/list_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/app/order/biz/service/mark_order_paid.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype MarkOrderPaidService struct {\n\tctx context.Context\n} // NewMarkOrderPaidService new MarkOrderPaidService\nfunc NewMarkOrderPaidService(ctx context.Context) *MarkOrderPaidService {\n\treturn &MarkOrderPaidService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *MarkOrderPaidService) Run(req *order.MarkOrderPaidReq) (resp *order.MarkOrderPaidResp, err error) {\n\t// Finish your business logic.\n\tif req.UserId == 0 || req.OrderId == \"\" {\n\t\terr = fmt.Errorf(\"user_id or order_id can not be empty\")\n\t\treturn\n\t}\n\t_, err = model.GetOrder(mysql.DB, s.ctx, req.UserId, req.OrderId)\n\tif err != nil {\n\t\tklog.Errorf(\"model.ListOrder.err:%v\", err)\n\t\treturn nil, err\n\t}\n\terr = model.UpdateOrderState(mysql.DB, s.ctx, req.UserId, req.OrderId, model.OrderStatePaid)\n\tif err != nil {\n\t\tklog.Errorf(\"model.ListOrder.err:%v\", err)\n\t\treturn nil, err\n\t}\n\tresp = &order.MarkOrderPaidResp{}\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/order/biz/service/mark_order_paid_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n)\n\nfunc TestMarkOrderPaid_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewMarkOrderPaidService(ctx)\n\t// init req and assert value\n\n\treq := &order.MarkOrderPaidReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/app/order/biz/service/place_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype PlaceOrderService struct {\n\tctx context.Context\n} // NewPlaceOrderService new PlaceOrderService\nfunc NewPlaceOrderService(ctx context.Context) *PlaceOrderService {\n\treturn &PlaceOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *PlaceOrderService) Run(req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\t// Finish your business logic.\n\tif len(req.OrderItems) == 0 {\n\t\terr = fmt.Errorf(\"OrderItems empty\")\n\t\treturn\n\t}\n\n\terr = mysql.DB.Transaction(func(tx *gorm.DB) error {\n\t\torderId, _ := uuid.NewUUID()\n\n\t\to := &model.Order{\n\t\t\tOrderId:      orderId.String(),\n\t\t\tOrderState:   model.OrderStatePlaced,\n\t\t\tUserId:       req.UserId,\n\t\t\tUserCurrency: req.UserCurrency,\n\t\t\tConsignee: model.Consignee{\n\t\t\t\tEmail: req.Email,\n\t\t\t},\n\t\t}\n\t\tif req.Address != nil {\n\t\t\ta := req.Address\n\t\t\to.Consignee.Country = a.Country\n\t\t\to.Consignee.State = a.State\n\t\t\to.Consignee.City = a.City\n\t\t\to.Consignee.StreetAddress = a.StreetAddress\n\t\t}\n\t\tif err := tx.Create(o).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvar itemList []*model.OrderItem\n\t\tfor _, v := range req.OrderItems {\n\t\t\titemList = append(itemList, &model.OrderItem{\n\t\t\t\tOrderIdRefer: o.OrderId,\n\t\t\t\tProductId:    v.Item.ProductId,\n\t\t\t\tQuantity:     v.Item.Quantity,\n\t\t\t\tCost:         v.Cost,\n\t\t\t})\n\t\t}\n\t\tif err := tx.Create(&itemList).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp = &order.PlaceOrderResp{\n\t\t\tOrder: &order.OrderResult{\n\t\t\t\tOrderId: orderId.String(),\n\t\t\t},\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/order/biz/service/place_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestPlaceOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/app/order/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"order\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/app/order/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/app/order/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/order/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/order/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/order/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/app/order/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/order\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/common => ../../common\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/app/order/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/app/order/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/service\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n)\n\n// OrderServiceImpl implements the last service interface defined in the IDL.\ntype OrderServiceImpl struct{}\n\n// PlaceOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) PlaceOrder(ctx context.Context, req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = service.NewPlaceOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// ListOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) ListOrder(ctx context.Context, req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\tresp, err = service.NewListOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// MarkOrderPaid implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) MarkOrderPaid(ctx context.Context, req *order.MarkOrderPaidReq) (resp *order.MarkOrderPaidResp, err error) {\n\tresp, err = service.NewMarkOrderPaidService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/app/order/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'order'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/app/order/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"strings\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitLog(&lumberjack.Logger{\n\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t})\n\tmtl.InitTracing(serviceName)\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := orderservice.NewServer(new(OrderServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddress := conf.GetConf().Kitex.Address\n\tif strings.HasPrefix(address, \":\") {\n\t\tlocalIp := utils.MustGetLocalIPv4()\n\t\taddress = localIp + address\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts, server.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName, RegistryAddr: conf.GetConf().Registry.RegistryAddress[0]}))\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/order/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/app/order/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/order\"\nexec \"$CURDIR/bin/order\"\n"
  },
  {
    "path": "gomall/app/order/test/rpc_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage test\n\nimport (\n\t\"testing\"\n)\n\nfunc TestMarkPaid(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/app/payment/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\ntmp\n\n.env\n"
  },
  {
    "path": "gomall/app/payment/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/app/payment/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.PaymentLog{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/payment/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/payment/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/app/payment/biz/model/payment.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype PaymentLog struct {\n\tBase\n\tUserId        uint32    `json:\"user_id\"`\n\tOrderId       string    `json:\"order_id\"`\n\tTransactionId string    `json:\"transaction_id\"`\n\tAmount        float32   `json:\"amount\"`\n\tPayAt         time.Time `json:\"pay_at\"`\n}\n\nfunc (p PaymentLog) TableName() string {\n\treturn \"payment\"\n}\n\nfunc CreatePaymentLog(db *gorm.DB, ctx context.Context, payment *PaymentLog) error {\n\treturn db.WithContext(ctx).Model(&PaymentLog{}).Create(payment).Error\n}\n"
  },
  {
    "path": "gomall/app/payment/biz/service/charge.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\tcreditcard \"github.com/durango/go-credit-card\"\n\t\"github.com/google/uuid\"\n)\n\ntype ChargeService struct {\n\tctx context.Context\n} // NewChargeService new ChargeService\nfunc NewChargeService(ctx context.Context) *ChargeService {\n\treturn &ChargeService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ChargeService) Run(req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tcard := creditcard.Card{\n\t\tNumber: req.CreditCard.CreditCardNumber,\n\t\tCvv:    strconv.Itoa(int(req.CreditCard.CreditCardCvv)),\n\t\tMonth:  strconv.Itoa(int(req.CreditCard.CreditCardExpirationMonth)),\n\t\tYear:   strconv.Itoa(int(req.CreditCard.CreditCardExpirationYear)),\n\t}\n\n\terr = card.Validate(true)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(400, err.Error())\n\t}\n\n\ttransactionId, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = model.CreatePaymentLog(mysql.DB, s.ctx, &model.PaymentLog{\n\t\tUserId:        req.UserId,\n\t\tOrderId:       req.OrderId,\n\t\tTransactionId: transactionId.String(),\n\t\tAmount:        req.Amount,\n\t\tPayAt:         time.Now(),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t\n\treturn &payment.ChargeResp{TransactionId: transactionId.String()}, nil\n}\n"
  },
  {
    "path": "gomall/app/payment/biz/service/charge_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCharge_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/app/payment/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"payment\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/app/payment/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/app/payment/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/payment/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/payment/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/payment/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/app/payment/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/payment\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/common => ../../common\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/app/payment/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082 h1:3RgcPZrUWhrxqhtDkuRmDTRVXGkxrVMZtJMic7cEtGA=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082/go.mod h1:jKPLGXGRR3v90kZOLs/kUMffoEot8IrRDGmmzI3kOtg=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/app/payment/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/service\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n)\n\n// PaymentServiceImpl implements the last service interface defined in the IDL.\ntype PaymentServiceImpl struct{}\n\n// Charge implements the PaymentServiceImpl interface.\nfunc (s *PaymentServiceImpl) Charge(ctx context.Context, req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tresp, err = service.NewChargeService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/app/payment/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'payment'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/app/payment/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"strings\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/middleware\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitLog(&lumberjack.Logger{\n\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t})\n\tmtl.InitTracing(serviceName)\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := paymentservice.NewServer(new(PaymentServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddress := conf.GetConf().Kitex.Address\n\tif strings.HasPrefix(address, \":\") {\n\t\tlocalIp := utils.MustGetLocalIPv4()\n\t\taddress = localIp + address\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMiddleware(middleware.ServerMiddleware),\n\t)\n\topts = append(opts, server.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName, RegistryAddr: conf.GetConf().Registry.RegistryAddress[0]}))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/payment/middleware/mw.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/pkg/endpoint\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n)\n\nfunc ServerMiddleware(next endpoint.Endpoint) endpoint.Endpoint {\n\treturn func(ctx context.Context, req, resp interface{}) (err error) {\n\t\tri := rpcinfo.GetRPCInfo(ctx)\n\t\t// get client serviceName\n\t\tklog.Infof(\"client serviceName: %v\\n\", ri.From().ServiceName())\n\t\tif err := next(ctx, req, resp); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "gomall/app/payment/payment.sql",
    "content": "create table payment\n(\n    id             int auto_increment,\n    user_id        int            not null,\n    order_id       varchar(100)   not null,\n    transaction_id varchar(100)   not null,\n    amount         decimal(10, 2) not null,\n    pay_at         datetime       not null,\n    created_at     datetime       not null default current_timestamp,\n    updated_at     datetime       not null default current_timestamp on update current_timestamp,\n    constraint payment_pk primary key (id)\n);"
  },
  {
    "path": "gomall/app/payment/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/app/payment/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/payment\"\nexec \"$CURDIR/bin/payment\"\n"
  },
  {
    "path": "gomall/app/payment/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/app/product/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n.env"
  },
  {
    "path": "gomall/app/product/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/app/product/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/plugin/opentelemetry/tracing\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.Product{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Product{},\n\t\t\t&model.Category{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `product`.`category` VALUES (1,'2023-12-06 15:05:06','2023-12-06 15:05:06','T-Shirt','T-Shirt'),(2,'2023-12-06 15:05:06','2023-12-06 15:05:06','Sticker','Sticker')\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product` VALUES ( 1, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Notebook', 'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ', '/static/image/notebook.jpeg', 9.90 ), ( 2, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Mouse-Pad', 'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ', '/static/image/mouse-pad.jpeg', 8.80 ), ( 3, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt.jpeg', 6.60 ), ( 4, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-1.jpeg', 2.20 ), ( 5, '2023-12-06 15:26:19', '2023-12-09 22:32:35', 'Sweatshirt', 'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.', '/static/image/sweatshirt.jpeg', 1.10 ), ( 6, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-2.jpeg', 1.80 ), ( 7, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'mascot', 'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.', '/static/image/logo.jpg', 4.80 )\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product_category` (product_id,category_id) VALUES ( 1, 2 ), ( 2, 2 ), ( 3, 1 ), ( 4, 1 ), ( 5, 1 ), ( 6, 1 ),( 7, 2 )\")\n\t\t}\n\t}\n\tif err := DB.Use(tracing.NewPlugin(tracing.WithoutMetrics(), tracing.WithTracerProvider(mtl.TracerProvider))); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/product/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/redis/go-redis/extra/redisotel/v9\"\n\t\"github.com/redis/go-redis/extra/redisprometheus/v9\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := redisotel.InstrumentTracing(RedisClient); err != nil {\n\t\tklog.Error(\"redis tracing collect error \", err)\n\t}\n\tif err := mtl.Registry.Register(redisprometheus.NewCollector(\"default\", \"product\", RedisClient)); err != nil {\n\t\tklog.Error(\"redis metric collect error \", err)\n\t}\n\tredisotel.InstrumentTracing(RedisClient) //nolint:errcheck\n}\n"
  },
  {
    "path": "gomall/app/product/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/app/product/biz/model/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Category struct {\n\tBase\n\tName        string    `json:\"name\"`\n\tDescription string    `json:\"description\"`\n\tProducts    []Product `json:\"product\" gorm:\"many2many:product_category\"`\n}\n\nfunc (c Category) TableName() string {\n\treturn \"category\"\n}\n\nfunc GetProductsByCategoryName(db *gorm.DB, ctx context.Context, name string) (category []Category, err error) {\n\terr = db.WithContext(ctx).Model(&Category{}).Where(&Category{Name: name}).Preload(\"Products\").Find(&category).Error\n\treturn category, err\n}\n"
  },
  {
    "path": "gomall/app/product/biz/model/product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tBase\n\tName        string     `json:\"name\"`\n\tDescription string     `json:\"description\"`\n\tPicture     string     `json:\"picture\"`\n\tPrice       float32    `json:\"price\"`\n\tCategories  []Category `json:\"categories\" gorm:\"many2many:product_category\"`\n}\n\nfunc (p Product) TableName() string {\n\treturn \"product\"\n}\n\ntype ProductQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (p ProductQuery) GetById(productId int) (product Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn\n}\n\nfunc NewProductQuery(ctx context.Context, db *gorm.DB) ProductQuery {\n\treturn ProductQuery{ctx: ctx, db: db}\n}\n\ntype CachedProductQuery struct {\n\tproductQuery ProductQuery\n\tcacheClient  *redis.Client\n\tprefix       string\n}\n\nfunc (c CachedProductQuery) GetById(productId int) (product Product, err error) {\n\tcacheKey := fmt.Sprintf(\"%s_%s_%d\", c.prefix, \"product_by_id\", productId)\n\tcachedResult := c.cacheClient.Get(c.productQuery.ctx, cacheKey)\n\n\terr = func() error {\n\t\terr1 := cachedResult.Err()\n\t\tif err1 != nil {\n\t\t\treturn err1\n\t\t}\n\t\tcachedResultByte, err2 := cachedResult.Bytes()\n\t\tif err2 != nil {\n\t\t\treturn err2\n\t\t}\n\t\terr3 := json.Unmarshal(cachedResultByte, &product)\n\t\tif err3 != nil {\n\t\t\treturn err3\n\t\t}\n\t\treturn nil\n\t}()\n\tif err != nil {\n\t\tproduct, err = c.productQuery.GetById(productId)\n\t\tif err != nil {\n\t\t\treturn Product{}, err\n\t\t}\n\t\tencoded, err := json.Marshal(product)\n\t\tif err != nil {\n\t\t\treturn product, nil\n\t\t}\n\t\t_ = c.cacheClient.Set(c.productQuery.ctx, cacheKey, encoded, time.Hour)\n\t}\n\treturn\n}\n\nfunc NewCachedProductQuery(pq ProductQuery, cacheClient *redis.Client) CachedProductQuery {\n\treturn CachedProductQuery{productQuery: pq, cacheClient: cacheClient, prefix: \"cloudwego_shop\"}\n}\n\nfunc GetProductById(db *gorm.DB, ctx context.Context, productId int) (product Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn product, err\n}\n\nfunc SearchProduct(db *gorm.DB, ctx context.Context, q string) (product []*Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Find(&product, \"name like ? or description like ?\", \"%\"+q+\"%\", \"%\"+q+\"%\").Error\n\treturn product, err\n}\n"
  },
  {
    "path": "gomall/app/product/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetProductService struct {\n\tctx context.Context\n} // NewGetProductService new GetProductService\nfunc NewGetProductService(ctx context.Context) *GetProductService {\n\treturn &GetProductService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetProductService) Run(req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\t// Finish your business logic.\n\tif req.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40000, \"product id is required\")\n\t}\n\n\tp, err := model.NewCachedProductQuery(model.NewProductQuery(s.ctx, mysql.DB), redis.RedisClient).GetById(int(req.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &product.GetProductResp{\n\t\tProduct: &product.Product{\n\t\t\tId:          uint32(p.ID),\n\t\t\tPicture:     p.Picture,\n\t\t\tPrice:       p.Price,\n\t\t\tDescription: p.Description,\n\t\t\tName:        p.Name,\n\t\t},\n\t}, err\n}\n"
  },
  {
    "path": "gomall/app/product/biz/service/get_product_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetProduct_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewGetProductService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.GetProductRequest{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/app/product/biz/service/list_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype ListProductsService struct {\n\tctx context.Context\n} // NewListProductsService new ListProductsService\nfunc NewListProductsService(ctx context.Context) *ListProductsService {\n\treturn &ListProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListProductsService) Run(req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\t// Finish your business logic.\n\tc, err := model.GetProductsByCategoryName(mysql.DB, s.ctx, req.CategoryName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &product.ListProductsResp{}\n\tfor _, v1 := range c {\n\t\tfor _, v := range v1.Products {\n\t\t\tresp.Products = append(resp.Products, &product.Product{Id: uint32(v.ID), Name: v.Name, Description: v.Description, Picture: v.Picture, Price: v.Price})\n\t\t}\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/app/product/biz/service/list_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewListProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.ListProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/app/product/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype SearchProductsService struct {\n\tctx context.Context\n} // NewSearchProductsService new SearchProductsService\nfunc NewSearchProductsService(ctx context.Context) *SearchProductsService {\n\treturn &SearchProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SearchProductsService) Run(req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\t// Finish your business logic.\n\tp, err := model.SearchProduct(mysql.DB, s.ctx, req.Query)\n\tvar results []*product.Product\n\tfor _, v := range p {\n\t\tresults = append(results, &product.Product{\n\t\t\tId:          uint32(v.ID),\n\t\t\tName:        v.Name,\n\t\t\tDescription: v.Description,\n\t\t\tPicture:     v.Picture,\n\t\t\tPrice:       v.Price,\n\t\t})\n\t}\n\treturn &product.SearchProductsResp{Results: results}, err\n}\n"
  },
  {
    "path": "gomall/app/product/biz/service/search_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestSearchProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewSearchProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.SearchProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/app/product/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"product\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/app/product/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n\t// Centralized Config Server\n\tConfigServer ConfigServer `yaml:\"configServer\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\ntype ConfigServer struct{}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/app/product/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/product/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/product/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/product/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/app/product/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/product\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/common => ../../common\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5\n\tgithub.com/redis/go-redis/extra/redisprometheus/v9 v9.0.5\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n\tgorm.io/plugin/opentelemetry v0.1.4\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/app/product/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI=\ngithub.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ=\ngithub.com/redis/go-redis/extra/redisprometheus/v9 v9.0.5 h1:kvl0LOTQD23VR1R7A9vDti9msfV6mOE2+j6ngYkFsfg=\ngithub.com/redis/go-redis/extra/redisprometheus/v9 v9.0.5/go.mod h1:VhyLk7MdSTKbJCx6+wXlj3/ebh49gTq3yBiXymYrG7w=\ngithub.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/driver/sqlite v1.5.0 h1:zKYbzRCpBrT1bNijRnxLDJWPjVfImGEn0lSnUY5gZ+c=\ngorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/plugin/opentelemetry v0.1.4 h1:7p0ocWELjSSRI7NCKPW2mVe6h43YPini99sNJcbsTuc=\ngorm.io/plugin/opentelemetry v0.1.4/go.mod h1:tndJHOdvPT0pyGhOb8E2209eXJCUxhC5UpKw7bGVWeI=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/app/product/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/service\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\n// ProductCatalogServiceImpl implements the last service interface defined in the IDL.\ntype ProductCatalogServiceImpl struct{}\n\n// ListProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) ListProducts(ctx context.Context, req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\tresp, err = service.NewListProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetProduct implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) GetProduct(ctx context.Context, req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tresp, err = service.NewGetProductService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// SearchProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) SearchProducts(ctx context.Context, req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\tresp, err = service.NewSearchProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/app/product/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'product'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/app/product/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"strings\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/provider\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitLog(&lumberjack.Logger{\n\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t})\n\tmtl.InitTracing(serviceName)\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := productcatalogservice.NewServer(new(ProductCatalogServiceImpl), opts...)\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddress := conf.GetConf().Kitex.Address\n\tif strings.HasPrefix(address, \":\") {\n\t\tlocalIp := utils.MustGetLocalIPv4()\n\t\taddress = localIp + address\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t_ = provider.NewOpenTelemetryProvider(\n\t\tprovider.WithSdkTracerProvider(mtl.TracerProvider),\n\t\tprovider.WithEnableMetrics(false),\n\t)\n\n\topts = append(opts, server.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName, RegistryAddr: conf.GetConf().Registry.RegistryAddress[0]}))\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/product/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/app/product/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/product\"\nexec \"$CURDIR/bin/product\"\n"
  },
  {
    "path": "gomall/app/product/script/product.sql",
    "content": "CREATE TABLE `category`\n(\n    `id`          int          NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)  NOT NULL,\n    `description` varchar(255) NOT NULL,\n    `created_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `category`\nVALUES (1, 'Clothes', 'Clothes', '2023-12-06 15:05:06', '2023-12-06 15:05:06'),\n       (2, 'Other', 'Other', '2023-12-06 15:05:06', '2023-12-06 15:05:06');\nCREATE TABLE `product`\n(\n    `id`          int            NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)    NOT NULL,\n    `description` varchar(255)   NOT NULL,\n    `picture`     varchar(255)   NOT NULL,\n    `price`       decimal(10, 2) NOT NULL,\n    `created_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product`\nVALUES (1, 'Notebook',\n        'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ',\n        '/static/image/notebook.jpeg', 9.90, '2023-12-06 15:26:19', '2023-12-09 22:29:10'),\n       (2, 'Mouse-Pad',\n        'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ',\n        '/static/image/mouse-pad.jpeg', 8.80, '2023-12-06 15:26:19', '2023-12-09 22:29:59'),\n       (3, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt.jpeg', 6.60, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (4, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-1.jpeg', 2.20, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (5, 'Sweatshirt',\n        'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.',\n        '/static/image/sweatshirt.jpeg', 1.10, '2023-12-06 15:26:19', '2023-12-09 22:32:35'),\n       (6, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-2.jpeg', 1.80, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (10, 'mascot',\n        'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.',\n        '/static/image/logo.jpg', 4.80, '2023-12-06 15:26:19', '2023-12-09 22:39:47');\nCREATE TABLE `product_category`\n(\n    `id`          int      NOT NULL AUTO_INCREMENT,\n    `product_id`  int      NOT NULL,\n    `category_id` int      NOT NULL,\n    `created_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product_category`\nVALUES (1, 1, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (2, 2, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (3, 3, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (4, 4, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (5, 5, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (6, 6, 1, '2023-12-06 15:27:30', '2023-12-09 22:41:47'),\n       (10, 10, 2, '2023-12-06 15:27:30', '2023-12-06 15:27:30');"
  },
  {
    "path": "gomall/app/product/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"shop-product\"\n"
  },
  {
    "path": "gomall/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.User{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.User{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `user` (`id`,`created_at`,`updated_at`,`email`,`password_hashed`) VALUES (1,'2023-12-26 09:46:19.852','2023-12-26 09:46:19.852','123@admin.com','$2a$10$jTvUFh7Z8Kw0hLV8WrAws.PRQTeuH4gopJ7ZMoiFvwhhz5Vw.bj7C')\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/app/user/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tBase\n\tEmail          string `gorm:\"unique\"`\n\tPasswordHashed string\n}\n\nfunc (u User) TableName() string {\n\treturn \"user\"\n}\n\nfunc GetByEmail(db *gorm.DB, ctx context.Context, email string) (user *User, err error) {\n\terr = db.WithContext(ctx).Model(&User{}).Where(&User{Email: email}).First(&user).Error\n\treturn\n}\n\nfunc Create(db *gorm.DB, ctx context.Context, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n"
  },
  {
    "path": "gomall/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tklog.Infof(\"LoginReq:%+v\", req)\n\tuserRow, err := model.GetByEmail(mysql.DB, s.ctx, req.Email)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(userRow.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn\n\t}\n\treturn &user.LoginResp{UserId: int32(userRow.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewLoginService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.LoginReq{\n\t// \tEmail:    \"1111@qq.com\",\n\t// \tPassword: \"123\",\n\t// }\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Password != req.ConfirmPassword {\n\t\terr = errors.New(\"Password must be the same as ConfirmPassword\")\n\t\treturn\n\t}\n\thashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(hashedPassword),\n\t}\n\tif err = model.Create(mysql.DB, s.ctx, newUser); err != nil {\n\t\treturn\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewRegisterService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.RegisterReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/common => ../../common\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"strings\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\n\tmtl.InitLog(&lumberjack.Logger{\n\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t})\n\tmtl.InitTracing(serviceName)\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddress := conf.GetConf().Kitex.Address\n\tif strings.HasPrefix(address, \":\") {\n\t\tlocalIp := utils.MustGetLocalIPv4()\n\t\taddress = localIp + address\n\t}\n\taddr, err := net.ResolveTCPAddr(\"tcp\", address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts = append(opts, server.WithServiceAddr(addr), server.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName, RegistryAddr: conf.GetConf().Registry.RegistryAddress[0]}))\n\treturn\n}\n"
  },
  {
    "path": "gomall/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/common/clientsuite/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage clientsuite\n\nimport (\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\ntype CommonGrpcClientSuite struct {\n\tCurrentServiceName string\n\tRegistryAddr       string\n}\n\nfunc (s CommonGrpcClientSuite) Options() []client.Option {\n\tr, err := consul.NewConsulResolver(s.RegistryAddr)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts := []client.Option{\n\t\tclient.WithResolver(r),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t}\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\t\tServiceName: s.CurrentServiceName,\n\t\t}),\n\t\tclient.WithSuite(tracing.NewClientSuite()),\n\t)\n\n\treturn opts\n}\n"
  },
  {
    "path": "gomall/common/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/common\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire (\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3\n\tgithub.com/kitex-contrib/config-consul v0.1.2\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/prometheus/client_golang v1.19.0\n\tgo.opentelemetry.io/otel v1.25.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0\n\tgo.opentelemetry.io/otel/sdk v1.25.0\n\tgo.uber.org/zap v1.27.0\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n"
  },
  {
    "path": "gomall/common/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/common/mtl/log.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/kitex/server\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\tkitexzap \"github.com/kitex-contrib/obs-opentelemetry/logging/zap\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\"\n)\n\nfunc InitLog(ioWriter io.Writer) {\n\tvar opts []kitexzap.Option\n\tvar output zapcore.WriteSyncer\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\topts = append(opts, kitexzap.WithCoreEnc(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())))\n\t\toutput = zapcore.AddSync(ioWriter)\n\t} else {\n\t\topts = append(opts, kitexzap.WithCoreEnc(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())))\n\t\t// async log\n\t\toutput = &zapcore.BufferedWriteSyncer{\n\t\t\tWS:            zapcore.AddSync(ioWriter),\n\t\t\tFlushInterval: time.Minute,\n\t\t}\n\t}\n\tserver.RegisterShutdownHook(func() {\n\t\toutput.Sync() //nolint:errcheck\n\t})\n\tlog := kitexzap.NewLogger(opts...)\n\tklog.SetLogger(log)\n\tklog.SetLevel(klog.LevelTrace)\n\tklog.SetOutput(output)\n}\n"
  },
  {
    "path": "gomall/common/mtl/metrics.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"net\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/kitex/pkg/registry\"\n\t\"github.com/cloudwego/kitex/server\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/collectors\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n)\n\nvar Registry *prometheus.Registry\n\nfunc InitMetric(serviceName string, metricsPort string, registryAddr string) {\n\tRegistry = prometheus.NewRegistry()\n\tRegistry.MustRegister(collectors.NewGoCollector())\n\tRegistry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))\n\n\tr, _ := consul.NewConsulRegister(registryAddr)\n\n\taddr, _ := net.ResolveTCPAddr(\"tcp\", metricsPort)\n\n\tregistryInfo := &registry.Info{\n\t\tServiceName: \"prometheus\",\n\t\tAddr:        addr,\n\t\tWeight:      1,\n\t\tTags:        map[string]string{\"service\": serviceName},\n\t}\n\n\t_ = r.Register(registryInfo)\n\n\tserver.RegisterShutdownHook(func() {\n\t\tr.Deregister(registryInfo) //nolint:errcheck\n\t})\n\n\thttp.Handle(\"/metrics\", promhttp.HandlerFor(Registry, promhttp.HandlerOpts{}))\n\tgo http.ListenAndServe(metricsPort, nil) //nolint:errcheck\n}\n"
  },
  {
    "path": "gomall/common/mtl/tracing.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/server\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.17.0\"\n)\n\nvar TracerProvider *tracesdk.TracerProvider\n\nfunc InitTracing(serviceName string) {\n\texporter, err := otlptracegrpc.New(context.Background())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tserver.RegisterShutdownHook(func() {\n\t\texporter.Shutdown(context.Background()) //nolint:errcheck\n\t})\n\tprocessor := tracesdk.NewBatchSpanProcessor(exporter)\n\tres, err := resource.New(context.Background(), resource.WithAttributes(semconv.ServiceNameKey.String(serviceName)))\n\tif err != nil {\n\t\tres = resource.Default()\n\t}\n\tTracerProvider = tracesdk.NewTracerProvider(tracesdk.WithSpanProcessor(processor), tracesdk.WithResource(res))\n\totel.SetTracerProvider(TracerProvider)\n}\n"
  },
  {
    "path": "gomall/common/serversuite/server.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage serversuite\n\nimport (\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/config-consul/consul\"\n\tconsulServer \"github.com/kitex-contrib/config-consul/server\"\n\tprometheus \"github.com/kitex-contrib/monitor-prometheus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tregistryconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\ntype CommonServerSuite struct {\n\tCurrentServiceName string\n\tRegistryAddr       string\n}\n\nfunc (s CommonServerSuite) Options() []server.Option {\n\topts := []server.Option{\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t}\n\n\tr, err := registryconsul.NewConsulRegister(s.RegistryAddr)\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\topts = append(opts, server.WithRegistry(r))\n\n\tif os.Getenv(\"CONFIG_CENTER_ENABLED\") == \"true\" {\n\t\tconsulNodes := os.Getenv(\"CONFIG_CENTER_NODES\")\n\t\tif consulNodes != \"\" {\n\t\t\tconsulClient, err := consul.NewClient(consul.Options{})\n\t\t\tif err != nil {\n\t\t\t\tklog.Error(err)\n\t\t\t} else {\n\t\t\t\topts = append(opts, server.WithSuite(consulServer.NewSuite(s.CurrentServiceName, consulClient)))\n\t\t\t}\n\t\t}\n\t}\n\n\t_ = provider.NewOpenTelemetryProvider(provider.WithSdkTracerProvider(mtl.TracerProvider), provider.WithEnableMetrics(false))\n\n\topts = append(opts,\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\t\tServiceName: s.CurrentServiceName,\n\t\t}),\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithTracer(prometheus.NewServerTracer(\"\", \"\", prometheus.WithDisableServer(true), prometheus.WithRegistry(mtl.Registry))),\n\t)\n\n\treturn opts\n}\n"
  },
  {
    "path": "gomall/common/utils/ip.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"errors\"\n\t\"net\"\n)\n\nfunc GetLocalIPv4() (string, error) {\n\tinterfaces, err := net.Interfaces()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfor _, iface := range interfaces {\n\t\tif iface.Flags&net.FlagLoopback != net.FlagLoopback && iface.Flags&net.FlagUp != 0 {\n\t\t\taddrs, err := iface.Addrs()\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tfor _, addr := range addrs {\n\t\t\t\tif ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() && ipNet.IP.To4() != nil {\n\t\t\t\t\treturn ipNet.IP.String(), nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn \"\", errors.New(\"get local IP error\")\n}\n\nfunc MustGetLocalIPv4() string {\n\tipv4, err := GetLocalIPv4()\n\tif err != nil {\n\t\tpanic(\"get local IP error\")\n\t}\n\treturn ipv4\n}\n"
  },
  {
    "path": "gomall/common/utils/kitex.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/deploy/config/loki.yml",
    "content": "# config.yml\nauth_enabled: false\n\nserver:\n  http_listen_port: 3100\n  grpc_listen_port: 9096\n\ncommon:\n  instance_addr: 127.0.0.1\n  path_prefix: /tmp/loki\n  storage:\n    filesystem:\n      chunks_directory: /tmp/loki/chunks\n      rules_directory: /tmp/loki/rules\n  replication_factor: 1\n  ring:\n    kvstore:\n      store: inmemory\n\nquery_range:\n  results_cache:\n    cache:\n      embedded_cache:\n        enabled: true\n        max_size_mb: 100\n\nschema_config:\n  configs:\n    - from: 2020-10-24\n      store: tsdb\n      object_store: filesystem\n      schema: v11\n      index:\n        prefix: index_\n        period: 24h\n"
  },
  {
    "path": "gomall/deploy/config/prometheus.yml",
    "content": "global:\n  scrape_interval: 15s\n\nscrape_configs:\n  - job_name: \"consul\"\n    consul_sd_configs:\n      - server: consul:8500\n        services:\n          - prometheus\n    relabel_configs:\n      - source_labels: [ __meta_consul_tags ]\n        action: replace\n        target_label: service\n        regex: \".*service:(.*?),.*\"\n        replacement: \"$1\"\n\n      - source_labels: [ __meta_consul_service_id ]\n        target_label: __metrics_path__\n        replacement: /metrics\n"
  },
  {
    "path": "gomall/deploy/config/promtail.yml",
    "content": "# config.yml\nserver:\n  http_listen_port: 9080\n  grpc_listen_port: 0\n\npositions:\n  filename: /tmp/positions.yaml\n\nclients:\n  - url: http://loki:3100/loki/api/v1/push\n\nscrape_configs:\n  - job_name: hertz\n    pipeline_stages:\n      - json:\n          expressions:\n            level: level\n      - labels:\n          level:\n    static_configs:\n      - targets:\n          - localhost\n        labels:\n          app: frontend\n          __path__: /logs/frontend/hertz.log"
  },
  {
    "path": "gomall/deploy/grafana.json",
    "content": "{\n  \"__inputs\": [\n    {\n      \"name\": \"DS_PROMETHEUS\",\n      \"label\": \"Prometheus\",\n      \"description\": \"\",\n      \"type\": \"datasource\",\n      \"pluginId\": \"prometheus\",\n      \"pluginName\": \"Prometheus\"\n    }\n  ],\n  \"__elements\": {},\n  \"__requires\": [\n    {\n      \"type\": \"panel\",\n      \"id\": \"gauge\",\n      \"name\": \"Gauge\",\n      \"version\": \"\"\n    },\n    {\n      \"type\": \"grafana\",\n      \"id\": \"grafana\",\n      \"name\": \"Grafana\",\n      \"version\": \"11.0.0\"\n    },\n    {\n      \"type\": \"datasource\",\n      \"id\": \"prometheus\",\n      \"name\": \"Prometheus\",\n      \"version\": \"1.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"timeseries\",\n      \"name\": \"Time series\",\n      \"version\": \"\"\n    }\n  ],\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"reqps\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 12,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"maxHeight\": 600,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum(rate(kitex_server_throughput{status=\\\"succeed\\\"}[1m])) by (service)\",\n          \"instant\": false,\n          \"legendFormat\": \"{{service}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"rps\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 0\n      },\n      \"id\": 3,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"11.0.0\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"go_goroutines\",\n          \"instant\": true,\n          \"legendFormat\": \"{{service}}\",\n          \"range\": false,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"current goroutines\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 0\n      },\n      \"id\": 1,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"maxHeight\": 600,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum by(service)(rate(go_gc_duration_seconds_count{}[$__rate_interval]))\",\n          \"instant\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{service}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"avg gc count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"µs\"\n        },\n        \"overrides\": [\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"product-GetProduct\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": true\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"maxHeight\": 600,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum by(service,method)(rate(kitex_server_latency_us_sum[1m]))/sum by(service,method)(rate(kitex_server_latency_us_count[1m]))\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"legendFormat\": \"{{service}}-{{method}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"server latency\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"µs\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 8\n      },\n      \"id\": 11,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"maxHeight\": 600,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"histogram_quantile(0.95, sum(rate(kitex_server_latency_us_bucket[1m])) by (service,le))\",\n          \"instant\": false,\n          \"legendFormat\": \"{{service}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"95 latency\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"µs\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 8\n      },\n      \"id\": 10,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"maxHeight\": 600,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"histogram_quantile(0.99, sum(rate(kitex_server_latency_us_bucket[1m])) by (service,le))\",\n          \"instant\": false,\n          \"legendFormat\": \"{{service}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"99 latency\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"maxHeight\": 600,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"avg by(service)(go_memstats_alloc_bytes{})\",\n          \"instant\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{service}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"memstats alloc\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 16\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"maxHeight\": 600,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"avg by(service)(go_goroutines)\",\n          \"instant\": false,\n          \"legendFormat\": \"__auto\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"avg goroutines\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 16\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"maxHeight\": 600,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"avg by(service)(go_memstats_heap_alloc_bytes{})\",\n          \"instant\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{service}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"memstats heap alloc\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 39,\n  \"tags\": [],\n  \"templating\": {\n    \"list\": []\n  },\n  \"time\": {\n    \"from\": \"now-1h\",\n    \"to\": \"now\"\n  },\n  \"timeRangeUpdatedDuringEditOrView\": false,\n  \"timepicker\": {},\n  \"timezone\": \"browser\",\n  \"title\": \"abcd\",\n  \"uid\": \"cdno7qr7ezxtsc1\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "gomall/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n  consul:\n    image: \"hashicorp/consul:latest\"\n    ports:\n      - \"8500:8500\"\n    environment:\n      CONSUL_BIND_INTERFACE: eth0\n  # Jaeger\n  jaeger-all-in-one:\n    container_name: jaeger-all-in-one\n    image: jaegertracing/all-in-one:latest\n    ports:\n      - \"16686:16686\"\n      - \"4317:4317\"\n      - \"4318:4318\"\n  prometheus:\n    image: prom/prometheus:latest\n    volumes:\n      - ./deploy/config/prometheus.yml:/etc/prometheus/prometheus.yml\n    command:\n      - \"--config.file=/etc/prometheus/prometheus.yml\"\n    ports:\n      - \"9090:9090\"\n  etcd:\n    image: docker.io/bitnami/etcd:3.5\n    environment:\n      - ALLOW_NONE_AUTHENTICATION=yes\n    ports:\n      - 2379:2379\n      - 2380:2380\n  nats:\n    image: nats:latest\n    ports:\n      - \"4222:4222\"\n      - \"8222:8222\"\n\n  grafana:\n    image: grafana/grafana:latest\n    environment:\n      - GF_AUTH_ANONYMOUS_ENABLED=true\n      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin\n      - GF_AUTH_DISABLE_LOGIN_FORM=true\n    ports:\n      - \"3000:3000\"\n\n  loki:\n    image: grafana/loki:2.9.2\n    volumes:\n      - ./deploy/config/loki.yml:/etc/loki/local-config.yaml\n    command: -config.file=/etc/loki/local-config.yaml\n    ports:\n      - \"3100:3100\"\n\n  promtail:\n    image: grafana/promtail:2.9.2\n    volumes:\n      - ./deploy/config/promtail.yml:/etc/promtail/config.yml\n      - ./app/frontend/log:/logs/frontend\n    command: -config.file=/etc/promtail/config.yml\n"
  },
  {
    "path": "gomall/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/cart\n\t./app/checkout\n\t./app/email\n\t./app/frontend\n\t./app/order\n\t./app/payment\n\t./app/product\n\t./app/user\n\t./common\n\trpc_gen\n)\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n"
  },
  {
    "path": "gomall/gomall.code-workspace",
    "content": "{\n  \"folders\": [\n    {\n      \"path\": \".\"\n    },\n    {\n      \"path\": \"app/frontend\"\n    },\n    {\n      \"path\": \"app/product\"\n    },\n    {\n      \"path\": \"app/user\"\n    },\n    {\n      \"path\": \"app/payment\"\n    },\n    {\n      \"path\": \"app/order\"\n    },\n    {\n      \"path\": \"app/checkout\"\n    },\n    {\n      \"path\": \"app/cart\"\n    },\n    {\n      \"path\": \"idl\"\n    }\n  ],\n  \"settings\": {}\n}\n"
  },
  {
    "path": "gomall/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n  optional string raw_body = 50101;\n  optional string query = 50102;\n  optional string header = 50103;\n  optional string cookie = 50104;\n  optional string body = 50105;\n  optional string path = 50106;\n  optional string vd = 50107;\n  optional string form = 50108;\n  optional string js_conv = 50109;\n  optional string file_name = 50110;\n  optional string none = 50111;\n\n  // 50131~50160 used to extend field option by hz\n  optional string form_compatible = 50131;\n  optional string js_conv_compatible = 50132;\n  optional string file_name_compatible = 50133;\n  optional string none_compatible = 50134;\n  // 50135 is reserved to vt_compatible\n  // optional FieldRules vt_compatible = 50135;\n\n  optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n  optional string get = 50201;\n  optional string post = 50202;\n  optional string put = 50203;\n  optional string delete = 50204;\n  optional string patch = 50205;\n  optional string options = 50206;\n  optional string head = 50207;\n  optional string any = 50208;\n  optional string gen_path =\n      50301; // The path specified by the user when the client code is\n             // generated, with a higher priority than api_version\n  optional string api_version =\n      50302; // Specify the value of the :version variable in path when the\n             // client code is generated\n  optional string tag = 50303;  // rpc tag, can be multiple, separated by commas\n  optional string name = 50304; // Name of rpc\n  optional string api_level = 50305;  // Interface Level\n  optional string serializer = 50306; // Serialization method\n  optional string param =\n      50307; // Whether client requests take public parameters\n  optional string baseurl = 50308; // Baseurl used in ttnet routing\n  optional string handler_path =\n      50309; // handler_path specifies the path to generate the method\n\n  // 50331~50360 used to extend method option by hz\n  optional string handler_path_compatible =\n      50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n  optional int32 http_code = 50401;\n\n  // 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n  optional string base_domain = 50402;\n\n  // 50731~50760 used to extend service option by hz\n  optional string base_domain_compatible = 50731;\n  optional string service_path = 50732;\n}\n\nextend google.protobuf.MessageOptions {\n  // optional FieldRules msg_vt = 50111;\n\n  optional string reserve = 50830;\n  // 550831 is reserved to msg_vt_compatible\n  // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/idl/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart;\n\noption go_package = '/cart';\n\nservice CartService {\n  rpc AddItem(AddItemReq) returns (AddItemResp) {}\n  rpc GetCart(GetCartReq) returns (GetCartResp) {}\n  rpc EmptyCart(EmptyCartReq) returns (EmptyCartResp) {}\n}\n\nmessage CartItem {\n  uint32 product_id = 1;\n  int32  quantity = 2;\n}\n\nmessage AddItemReq {\n  uint32 user_id = 1;\n  CartItem item = 2;\n}\n\nmessage AddItemResp {}\n\nmessage EmptyCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartResp {\n  Cart cart = 1;\n}\n\nmessage Cart {\n  uint32 user_id = 1;\n  repeated CartItem items = 2;\n}\n\nmessage EmptyCartResp {}\n"
  },
  {
    "path": "gomall/idl/checkout.proto",
    "content": "syntax = \"proto3\";\n\npackage  checkout;\n\nimport \"payment.proto\";\n\noption go_package = \"/checkout\";\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (CheckoutResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  string zip_code = 5;\n}\n\nmessage CheckoutReq {\n  uint32 user_id = 1;\n  string firstname = 2;\n  string lastname = 3;\n  string email = 4;\n  Address address = 5;\n  payment.CreditCardInfo credit_card = 6;\n}\n\nmessage CheckoutResp {\n  string order_id = 1;\n  string transaction_id = 2;\n}"
  },
  {
    "path": "gomall/idl/email.proto",
    "content": "syntax = \"proto3\";\n\npackage email;\n\noption go_package = \"/email\";\n\nmessage EmailReq{\n  string from = 1;\n  string to = 2;\n  string content_type = 3;\n  string subject = 4;\n  string content = 5;\n}\n\nmessage EmailResp {\n\n}\n\nservice EmailService{\n  rpc Send(EmailReq) returns (EmailResp);\n}"
  },
  {
    "path": "gomall/idl/frontend/about.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.about;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/about\";\n\nservice AboutService {\n  rpc About(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/about\";\n  }\n}\n"
  },
  {
    "path": "gomall/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/auth\";\n\nmessage RegisterReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string confirm_password = 3 [(api.form) = \"confirm_password\"];\n}\n\nmessage LoginReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string next = 3 [(api.query) = \"next\"];\n}\n\nservice AuthService {\n  rpc register(RegisterReq) returns (common.Empty) {\n    option (api.post) = \"/auth/register\";\n  }\n  rpc login(LoginReq) returns (common.Empty) {\n    option (api.post) = \"/auth/login\";\n  }\n  rpc logout(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/auth/logout\";\n  }\n}\n"
  },
  {
    "path": "gomall/idl/frontend/cart_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.cart;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/cart\";\n\nmessage AddCartReq {\n  uint32 product_id = 1 [(api.form) = \"productId\"];\n  int32 product_num = 2 [(api.form) = \"productNum\"];\n}\n\nservice CartService {\n  rpc AddCartItem(AddCartReq) returns (common.Empty) {\n    option (api.post) = \"/cart\";\n  }\n  rpc GetCart(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/cart\";\n  }\n}\n"
  },
  {
    "path": "gomall/idl/frontend/category_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.category;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/category\";\n\nmessage CategoryReq {\n  string category = 1 [(api.path) = \"category\"];\n}\n\nservice CategoryService {\n  rpc Category(CategoryReq) returns (common.Empty) {\n    option (api.get) = \"/category/:category\";\n  }\n}\n"
  },
  {
    "path": "gomall/idl/frontend/checkout_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.checkout;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/checkout\";\n\nmessage CheckoutReq {\n  string email = 1 [(api.form) = \"email\"];\n  string firstname = 2 [(api.form) = \"firstname\"];\n  string lastname = 3 [(api.form) = \"lastname\"];\n  string street = 4 [(api.form) = \"street\"];\n  string zipcode = 5 [(api.form) = \"zipcode\"];\n  string province = 6 [(api.form) = \"province\"];\n  string country = 7 [(api.form) = \"country\"];\n  string city = 8 [(api.form) = \"city\"];\n  string card_num = 9 [(api.form) = \"cardNum\"];\n  int32 expiration_month = 10 [(api.form) = \"expirationMonth\"];\n  int32 expiration_year = 11 [(api.form) = \"expirationYear\"];\n  int32 cvv = 12 [(api.form) = \"cvv\"];\n  string payment = 13 [(api.form) = \"payment\"];\n}\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (common.Empty) {\n    option (api.get) = \"/checkout\";\n  }\n  rpc CheckoutWaiting(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/checkout/waiting\";\n  }\n  rpc CheckoutResult(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/checkout/result\";\n  }\n}\n"
  },
  {
    "path": "gomall/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\nmessage Base {\n  string title = 1;\n  uint32 user_id = 2;\n}\n\nmessage Empty {}"
  },
  {
    "path": "gomall/idl/frontend/home.proto",
    "content": "syntax = 'proto3';\n\npackage frontend.common;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/home\";\n\nservice HomeService {\n  rpc Home(common.Empty) returns (Empty) { option (api.get) = \"/\"; }\n}\n"
  },
  {
    "path": "gomall/idl/frontend/order_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.order;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/order\";\n\nservice OrderService {\n  rpc OrderList(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/order\";\n  }\n}\n"
  },
  {
    "path": "gomall/idl/frontend/product_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.product;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/product\";\n\nmessage ProductReq {\n  uint32 id = 1 [(api.query) = \"id\"];\n}\n\nmessage SearchProductsReq {\n  string q = 1 [(api.query) = \"q\"];\n}\n\nservice ProductService {\n  rpc GetProduct(ProductReq) returns (common.Empty) {\n    option (api.get) = \"/product\";\n  }\n  rpc SearchProducs(SearchProductsReq) returns (common.Empty) {\n    option (api.get) = \"/search\";\n  }\n}\n"
  },
  {
    "path": "gomall/idl/order.proto",
    "content": "syntax = \"proto3\";\n\npackage order;\n\nimport \"cart.proto\";\n\noption go_package = \"order\";\n\nservice OrderService {\n  rpc PlaceOrder(PlaceOrderReq) returns (PlaceOrderResp) {}\n  rpc ListOrder(ListOrderReq) returns (ListOrderResp) {}\n  rpc MarkOrderPaid(MarkOrderPaidReq) returns (MarkOrderPaidResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  int32 zip_code = 5;\n}\n\nmessage PlaceOrderReq {\n  uint32 user_id = 1;\n  string user_currency = 2;\n\n  Address address = 3;\n  string email = 4;\n  repeated OrderItem order_items = 5;\n}\n\nmessage OrderItem {\n  cart.CartItem item = 1;\n  float cost = 2;\n}\n\nmessage OrderResult {\n  string order_id = 1;\n}\n\nmessage PlaceOrderResp {\n  OrderResult order = 1;\n}\n\nmessage ListOrderReq {\n  uint32 user_id = 1;\n}\n\nmessage Order {\n  repeated OrderItem order_items = 1;\n  string order_id = 2;\n  uint32 user_id = 3;\n  string user_currency = 4;\n  Address address = 5;\n  string email = 6;\n  int32 created_at = 7;\n}\n\nmessage ListOrderResp {\n  repeated Order orders = 1;\n}\n\nmessage MarkOrderPaidReq {\n  uint32 user_id = 1;\n  string order_id = 2;\n}\n\nmessage MarkOrderPaidResp {}"
  },
  {
    "path": "gomall/idl/payment.proto",
    "content": "syntax = \"proto3\";\n\npackage payment;\n\noption go_package = \"payment\";\n\n\nservice PaymentService {\n  rpc Charge(ChargeReq) returns (ChargeResp) {}\n}\n\nmessage CreditCardInfo {\n  string credit_card_number = 1;\n  int32 credit_card_cvv = 2;\n  int32 credit_card_expiration_year = 3;\n  int32 credit_card_expiration_month = 4;\n}\n\nmessage ChargeReq {\n  float amount = 1;\n  CreditCardInfo credit_card = 2;\n  string order_id = 3;\n  uint32 user_id = 4;\n}\n\nmessage ChargeResp {\n  string transaction_id = 1;\n}\n"
  },
  {
    "path": "gomall/idl/product.proto",
    "content": "syntax = \"proto3\";\n\npackage product;\n\noption go_package = \"/product\";\n\nservice ProductCatalogService {\n  rpc ListProducts(ListProductsReq) returns (ListProductsResp) {}\n  rpc GetProduct(GetProductReq) returns (GetProductResp) {}\n  rpc SearchProducts(SearchProductsReq) returns (SearchProductsResp) {}\n}\n\nmessage ListProductsReq{\n  int32 page = 1;\n  int64 pageSize = 2;\n\n  string categoryName = 3;\n}\n\nmessage Product {\n  uint32 id = 1;\n  string name = 2;\n  string description = 3;\n  string picture = 4;\n  float price = 5;\n\n  repeated string categories = 6;\n}\n\nmessage ListProductsResp {\n  repeated Product products = 1;\n}\n\nmessage GetProductReq {\n  uint32 id = 1;\n}\n\nmessage GetProductResp {\n  Product product = 1;\n}\n\nmessage SearchProductsReq {\n  string query = 1;\n}\n\nmessage SearchProductsResp {\n  repeated Product results = 1;\n}\n"
  },
  {
    "path": "gomall/idl/user.proto",
    "content": "syntax=\"proto3\";\n\npackage user;\n\noption go_package=\"/user\";\n\nservice UserService {\n    rpc Register(RegisterReq) returns (RegisterResp) {}\n    rpc Login(LoginReq) returns (LoginResp) {}\n}\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string confirm_password = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email= 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n"
  },
  {
    "path": "gomall/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgoogle.golang.org/protobuf v1.33.0\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/pretty v0.3.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/cart/cart.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CartItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CartItem[number], err)\n}\n\nfunc (x *CartItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.ProductId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CartItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Quantity, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_AddItemReq[number], err)\n}\n\nfunc (x *AddItemReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *AddItemResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmptyCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmptyCartReq[number], err)\n}\n\nfunc (x *EmptyCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartReq[number], err)\n}\n\nfunc (x *GetCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartResp[number], err)\n}\n\nfunc (x *GetCartResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Cart\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Cart = &v\n\treturn offset, nil\n}\n\nfunc (x *Cart) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Cart[number], err)\n}\n\nfunc (x *Cart) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Cart) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *EmptyCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *CartItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.ProductId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetProductId())\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Quantity == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetQuantity())\n\treturn offset\n}\n\nfunc (x *AddItemReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItem())\n\treturn offset\n}\n\nfunc (x *AddItemResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Cart == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetCart())\n\treturn offset\n}\n\nfunc (x *Cart) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField2(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *CartItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CartItem) sizeField1() (n int) {\n\tif x.ProductId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetProductId())\n\treturn n\n}\n\nfunc (x *CartItem) sizeField2() (n int) {\n\tif x.Quantity == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetQuantity())\n\treturn n\n}\n\nfunc (x *AddItemReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField2() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetItem())\n\treturn n\n}\n\nfunc (x *AddItemResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *EmptyCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartResp) sizeField1() (n int) {\n\tif x.Cart == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetCart())\n\treturn n\n}\n\nfunc (x *Cart) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *Cart) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Cart) sizeField2() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(2, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_CartItem = map[int32]string{\n\t1: \"ProductId\",\n\t2: \"Quantity\",\n}\n\nvar fieldIDToName_AddItemReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Item\",\n}\n\nvar fieldIDToName_AddItemResp = map[int32]string{}\n\nvar fieldIDToName_EmptyCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartResp = map[int32]string{\n\t1: \"Cart\",\n}\n\nvar fieldIDToName_Cart = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Items\",\n}\n\nvar fieldIDToName_EmptyCartResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/cart/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.1\n// source: cart.proto\n\npackage cart\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\"`\n\tQuantity  int32  `protobuf:\"varint,2,opt,name=quantity,proto3\" json:\"quantity,omitempty\"`\n}\n\nfunc (x *CartItem) Reset() {\n\t*x = CartItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartItem) ProtoMessage() {}\n\nfunc (x *CartItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartItem.ProtoReflect.Descriptor instead.\nfunc (*CartItem) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartItem) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetQuantity() int32 {\n\tif x != nil {\n\t\treturn x.Quantity\n\t}\n\treturn 0\n}\n\ntype AddItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32    `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItem   *CartItem `protobuf:\"bytes,2,opt,name=item,proto3\" json:\"item,omitempty\"`\n}\n\nfunc (x *AddItemReq) Reset() {\n\t*x = AddItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemReq) ProtoMessage() {}\n\nfunc (x *AddItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddItemReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *AddItemReq) GetItem() *CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\ntype AddItemResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *AddItemResp) Reset() {\n\t*x = AddItemResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemResp) ProtoMessage() {}\n\nfunc (x *AddItemResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemResp.ProtoReflect.Descriptor instead.\nfunc (*AddItemResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{2}\n}\n\ntype EmptyCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *EmptyCartReq) Reset() {\n\t*x = EmptyCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartReq) ProtoMessage() {}\n\nfunc (x *EmptyCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartReq.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EmptyCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *GetCartReq) Reset() {\n\t*x = GetCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReq) ProtoMessage() {}\n\nfunc (x *GetCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReq.ProtoReflect.Descriptor instead.\nfunc (*GetCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCart *Cart `protobuf:\"bytes,1,opt,name=cart,proto3\" json:\"cart,omitempty\"`\n}\n\nfunc (x *GetCartResp) Reset() {\n\t*x = GetCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartResp) ProtoMessage() {}\n\nfunc (x *GetCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartResp.ProtoReflect.Descriptor instead.\nfunc (*GetCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *GetCartResp) GetCart() *Cart {\n\tif x != nil {\n\t\treturn x.Cart\n\t}\n\treturn nil\n}\n\ntype Cart struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32      `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItems  []*CartItem `protobuf:\"bytes,2,rep,name=items,proto3\" json:\"items,omitempty\"`\n}\n\nfunc (x *Cart) Reset() {\n\t*x = Cart{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Cart) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Cart) ProtoMessage() {}\n\nfunc (x *Cart) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Cart.ProtoReflect.Descriptor instead.\nfunc (*Cart) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Cart) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Cart) GetItems() []*CartItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\ntype EmptyCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmptyCartResp) Reset() {\n\t*x = EmptyCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartResp) ProtoMessage() {}\n\nfunc (x *EmptyCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartResp.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{7}\n}\n\nvar File_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x08, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0a, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04,\n\t0x69, 0x74, 0x65, 0x6d, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x27, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0a,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x1e, 0x0a, 0x04, 0x63, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x52, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x04, 0x43, 0x61, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74,\n\t0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x45, 0x6d, 0x70,\n\t0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x32, 0xa9, 0x01, 0x0a, 0x0b, 0x43,\n\t0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x47,\n\t0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36,\n\t0x0a, 0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x12, 0x12, 0x2e, 0x63, 0x61,\n\t0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a,\n\t0x13, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62,\n\t0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72,\n\t0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_proto_rawDescOnce sync.Once\n\tfile_cart_proto_rawDescData = file_cart_proto_rawDesc\n)\n\nfunc file_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_proto_rawDescData)\n\t})\n\treturn file_cart_proto_rawDescData\n}\n\nvar file_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_cart_proto_goTypes = []interface{}{\n\t(*CartItem)(nil),      // 0: cart.CartItem\n\t(*AddItemReq)(nil),    // 1: cart.AddItemReq\n\t(*AddItemResp)(nil),   // 2: cart.AddItemResp\n\t(*EmptyCartReq)(nil),  // 3: cart.EmptyCartReq\n\t(*GetCartReq)(nil),    // 4: cart.GetCartReq\n\t(*GetCartResp)(nil),   // 5: cart.GetCartResp\n\t(*Cart)(nil),          // 6: cart.Cart\n\t(*EmptyCartResp)(nil), // 7: cart.EmptyCartResp\n}\nvar file_cart_proto_depIdxs = []int32{\n\t0, // 0: cart.AddItemReq.item:type_name -> cart.CartItem\n\t6, // 1: cart.GetCartResp.cart:type_name -> cart.Cart\n\t0, // 2: cart.Cart.items:type_name -> cart.CartItem\n\t1, // 3: cart.CartService.AddItem:input_type -> cart.AddItemReq\n\t4, // 4: cart.CartService.GetCart:input_type -> cart.GetCartReq\n\t3, // 5: cart.CartService.EmptyCart:input_type -> cart.EmptyCartReq\n\t2, // 6: cart.CartService.AddItem:output_type -> cart.AddItemResp\n\t5, // 7: cart.CartService.GetCart:output_type -> cart.GetCartResp\n\t7, // 8: cart.CartService.EmptyCart:output_type -> cart.EmptyCartResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_proto_init() }\nfunc file_cart_proto_init() {\n\tif File_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Cart); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_proto = out.File\n\tfile_cart_proto_rawDesc = nil\n\tfile_cart_proto_goTypes = nil\n\tfile_cart_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CartService interface {\n\tAddItem(ctx context.Context, req *AddItemReq) (res *AddItemResp, err error)\n\tGetCart(ctx context.Context, req *GetCartReq) (res *GetCartResp, err error)\n\tEmptyCart(ctx context.Context, req *EmptyCartReq) (res *EmptyCartResp, err error)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/cart/cartservice/cartservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfo\n}\n\nvar cartServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CartService\"\n\thandlerType := (*cart.CartService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"AddItem\":   kitex.NewMethodInfo(addItemHandler, newAddItemArgs, newAddItemResult, false),\n\t\t\"GetCart\":   kitex.NewMethodInfo(getCartHandler, newGetCartArgs, newGetCartResult, false),\n\t\t\"EmptyCart\": kitex.NewMethodInfo(emptyCartHandler, newEmptyCartArgs, newEmptyCartResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"cart\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc addItemHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.AddItemReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).AddItem(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *AddItemArgs:\n\t\tsuccess, err := handler.(cart.CartService).AddItem(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*AddItemResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newAddItemArgs() interface{} {\n\treturn &AddItemArgs{}\n}\n\nfunc newAddItemResult() interface{} {\n\treturn &AddItemResult{}\n}\n\ntype AddItemArgs struct {\n\tReq *cart.AddItemReq\n}\n\nfunc (p *AddItemArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.AddItemReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *AddItemArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *AddItemArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *AddItemArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar AddItemArgs_Req_DEFAULT *cart.AddItemReq\n\nfunc (p *AddItemArgs) GetReq() *cart.AddItemReq {\n\tif !p.IsSetReq() {\n\t\treturn AddItemArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *AddItemArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *AddItemArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype AddItemResult struct {\n\tSuccess *cart.AddItemResp\n}\n\nvar AddItemResult_Success_DEFAULT *cart.AddItemResp\n\nfunc (p *AddItemResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.AddItemResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *AddItemResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *AddItemResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *AddItemResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *AddItemResult) GetSuccess() *cart.AddItemResp {\n\tif !p.IsSetSuccess() {\n\t\treturn AddItemResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *AddItemResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.AddItemResp)\n}\n\nfunc (p *AddItemResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *AddItemResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.GetCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).GetCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).GetCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetCartArgs() interface{} {\n\treturn &GetCartArgs{}\n}\n\nfunc newGetCartResult() interface{} {\n\treturn &GetCartResult{}\n}\n\ntype GetCartArgs struct {\n\tReq *cart.GetCartReq\n}\n\nfunc (p *GetCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.GetCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetCartArgs_Req_DEFAULT *cart.GetCartReq\n\nfunc (p *GetCartArgs) GetReq() *cart.GetCartReq {\n\tif !p.IsSetReq() {\n\t\treturn GetCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetCartResult struct {\n\tSuccess *cart.GetCartResp\n}\n\nvar GetCartResult_Success_DEFAULT *cart.GetCartResp\n\nfunc (p *GetCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.GetCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetCartResult) GetSuccess() *cart.GetCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.GetCartResp)\n}\n\nfunc (p *GetCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc emptyCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.EmptyCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).EmptyCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EmptyCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).EmptyCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EmptyCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEmptyCartArgs() interface{} {\n\treturn &EmptyCartArgs{}\n}\n\nfunc newEmptyCartResult() interface{} {\n\treturn &EmptyCartResult{}\n}\n\ntype EmptyCartArgs struct {\n\tReq *cart.EmptyCartReq\n}\n\nfunc (p *EmptyCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.EmptyCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EmptyCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EmptyCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EmptyCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EmptyCartArgs_Req_DEFAULT *cart.EmptyCartReq\n\nfunc (p *EmptyCartArgs) GetReq() *cart.EmptyCartReq {\n\tif !p.IsSetReq() {\n\t\treturn EmptyCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EmptyCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EmptyCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EmptyCartResult struct {\n\tSuccess *cart.EmptyCartResp\n}\n\nvar EmptyCartResult_Success_DEFAULT *cart.EmptyCartResp\n\nfunc (p *EmptyCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.EmptyCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EmptyCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EmptyCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EmptyCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EmptyCartResult) GetSuccess() *cart.EmptyCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn EmptyCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EmptyCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.EmptyCartResp)\n}\n\nfunc (p *EmptyCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EmptyCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) AddItem(ctx context.Context, Req *cart.AddItemReq) (r *cart.AddItemResp, err error) {\n\tvar _args AddItemArgs\n\t_args.Req = Req\n\tvar _result AddItemResult\n\tif err = p.c.Call(ctx, \"AddItem\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetCart(ctx context.Context, Req *cart.GetCartReq) (r *cart.GetCartResp, err error) {\n\tvar _args GetCartArgs\n\t_args.Req = Req\n\tvar _result GetCartResult\n\tif err = p.c.Call(ctx, \"GetCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq) (r *cart.EmptyCartResp, err error) {\n\tvar _args EmptyCartArgs\n\t_args.Req = Req\n\tvar _result EmptyCartResult\n\tif err = p.c.Call(ctx, \"EmptyCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/cart/cartservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCartServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCartServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCartServiceClient) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.AddItem(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetCart(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.EmptyCart(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/cart/cartservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler cart.CartService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/cart/cartservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler cart.CartService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/checkout/checkout.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tfmt \"fmt\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutReq[number], err)\n}\n\nfunc (x *CheckoutReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Firstname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Lastname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutReq) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v payment.CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutResp[number], err)\n}\n\nfunc (x *CheckoutResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutResp) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Firstname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetFirstname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Lastname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetLastname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField6(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 6, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField2(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *CheckoutReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField2() (n int) {\n\tif x.Firstname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetFirstname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField3() (n int) {\n\tif x.Lastname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetLastname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField6() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(6, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *CheckoutResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField2() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_CheckoutReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Firstname\",\n\t3: \"Lastname\",\n\t4: \"Email\",\n\t5: \"Address\",\n\t6: \"CreditCard\",\n}\n\nvar fieldIDToName_CheckoutResp = map[int32]string{\n\t1: \"OrderId\",\n\t2: \"TransactionId\",\n}\n\nvar _ = payment.File_payment_proto\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/checkout/checkout.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.1\n// source: checkout.proto\n\npackage checkout\n\nimport (\n\tcontext \"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       string `protobuf:\"bytes,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() string {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn \"\"\n}\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId     uint32                  `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tFirstname  string                  `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\"`\n\tLastname   string                  `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\"`\n\tEmail      string                  `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tAddress    *Address                `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tCreditCard *payment.CreditCardInfo `protobuf:\"bytes,6,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CheckoutReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *CheckoutReq) GetCreditCard() *payment.CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\ntype CheckoutResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId       string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tTransactionId string `protobuf:\"bytes,2,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *CheckoutResp) Reset() {\n\t*x = CheckoutResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutResp) ProtoMessage() {}\n\nfunc (x *CheckoutResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutResp.ProtoReflect.Descriptor instead.\nfunc (*CheckoutResp) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CheckoutResp) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_proto protoreflect.FileDescriptor\n\nvar file_checkout_proto_rawDesc = []byte{\n\t0x0a, 0x0e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x0d, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f,\n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,\n\t0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,\n\t0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79,\n\t0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x0b,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75,\n\t0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73,\n\t0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x22, 0x50, 0x0a, 0x0c, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,\n\t0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x4e, 0x0a,\n\t0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x3b, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x15, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_proto_rawDescOnce sync.Once\n\tfile_checkout_proto_rawDescData = file_checkout_proto_rawDesc\n)\n\nfunc file_checkout_proto_rawDescGZIP() []byte {\n\tfile_checkout_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_proto_rawDescData)\n\t})\n\treturn file_checkout_proto_rawDescData\n}\n\nvar file_checkout_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_checkout_proto_goTypes = []interface{}{\n\t(*Address)(nil),                // 0: checkout.Address\n\t(*CheckoutReq)(nil),            // 1: checkout.CheckoutReq\n\t(*CheckoutResp)(nil),           // 2: checkout.CheckoutResp\n\t(*payment.CreditCardInfo)(nil), // 3: payment.CreditCardInfo\n}\nvar file_checkout_proto_depIdxs = []int32{\n\t0, // 0: checkout.CheckoutReq.address:type_name -> checkout.Address\n\t3, // 1: checkout.CheckoutReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 2: checkout.CheckoutService.Checkout:input_type -> checkout.CheckoutReq\n\t2, // 3: checkout.CheckoutService.Checkout:output_type -> checkout.CheckoutResp\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_proto_init() }\nfunc file_checkout_proto_init() {\n\tif File_checkout_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_proto = out.File\n\tfile_checkout_proto_rawDesc = nil\n\tfile_checkout_proto_goTypes = nil\n\tfile_checkout_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CheckoutService interface {\n\tCheckout(ctx context.Context, req *CheckoutReq) (res *CheckoutResp, err error)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/checkout/checkoutservice/checkoutservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfo\n}\n\nvar checkoutServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CheckoutService\"\n\thandlerType := (*checkout.CheckoutService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Checkout\": kitex.NewMethodInfo(checkoutHandler, newCheckoutArgs, newCheckoutResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"checkout\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc checkoutHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(checkout.CheckoutReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(checkout.CheckoutService).Checkout(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *CheckoutArgs:\n\t\tsuccess, err := handler.(checkout.CheckoutService).Checkout(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*CheckoutResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newCheckoutArgs() interface{} {\n\treturn &CheckoutArgs{}\n}\n\nfunc newCheckoutResult() interface{} {\n\treturn &CheckoutResult{}\n}\n\ntype CheckoutArgs struct {\n\tReq *checkout.CheckoutReq\n}\n\nfunc (p *CheckoutArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(checkout.CheckoutReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *CheckoutArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *CheckoutArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *CheckoutArgs) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar CheckoutArgs_Req_DEFAULT *checkout.CheckoutReq\n\nfunc (p *CheckoutArgs) GetReq() *checkout.CheckoutReq {\n\tif !p.IsSetReq() {\n\t\treturn CheckoutArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *CheckoutArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *CheckoutArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype CheckoutResult struct {\n\tSuccess *checkout.CheckoutResp\n}\n\nvar CheckoutResult_Success_DEFAULT *checkout.CheckoutResp\n\nfunc (p *CheckoutResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(checkout.CheckoutResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *CheckoutResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *CheckoutResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *CheckoutResult) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *CheckoutResult) GetSuccess() *checkout.CheckoutResp {\n\tif !p.IsSetSuccess() {\n\t\treturn CheckoutResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *CheckoutResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*checkout.CheckoutResp)\n}\n\nfunc (p *CheckoutResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *CheckoutResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq) (r *checkout.CheckoutResp, err error) {\n\tvar _args CheckoutArgs\n\t_args.Req = Req\n\tvar _result CheckoutResult\n\tif err = p.c.Call(ctx, \"Checkout\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/checkout/checkoutservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCheckoutServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCheckoutServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCheckoutServiceClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Checkout(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/checkout/checkoutservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler checkout.CheckoutService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/checkout/checkoutservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler checkout.CheckoutService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/email/email.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage email\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *EmailReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmailReq[number], err)\n}\n\nfunc (x *EmailReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.From, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.To, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ContentType, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Subject, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Content, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmailReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.From == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetFrom())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.To == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTo())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ContentType == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetContentType())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Subject == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetSubject())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Content == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetContent())\n\treturn offset\n}\n\nfunc (x *EmailResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmailReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField1() (n int) {\n\tif x.From == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetFrom())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField2() (n int) {\n\tif x.To == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTo())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField3() (n int) {\n\tif x.ContentType == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetContentType())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField4() (n int) {\n\tif x.Subject == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetSubject())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField5() (n int) {\n\tif x.Content == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetContent())\n\treturn n\n}\n\nfunc (x *EmailResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_EmailReq = map[int32]string{\n\t1: \"From\",\n\t2: \"To\",\n\t3: \"ContentType\",\n\t4: \"Subject\",\n\t5: \"Content\",\n}\n\nvar fieldIDToName_EmailResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/email/email.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: email.proto\n\npackage email\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype EmailReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFrom        string `protobuf:\"bytes,1,opt,name=from,proto3\" json:\"from,omitempty\"`\n\tTo          string `protobuf:\"bytes,2,opt,name=to,proto3\" json:\"to,omitempty\"`\n\tContentType string `protobuf:\"bytes,3,opt,name=content_type,json=contentType,proto3\" json:\"content_type,omitempty\"`\n\tSubject     string `protobuf:\"bytes,4,opt,name=subject,proto3\" json:\"subject,omitempty\"`\n\tContent     string `protobuf:\"bytes,5,opt,name=content,proto3\" json:\"content,omitempty\"`\n}\n\nfunc (x *EmailReq) Reset() {\n\t*x = EmailReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailReq) ProtoMessage() {}\n\nfunc (x *EmailReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailReq.ProtoReflect.Descriptor instead.\nfunc (*EmailReq) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *EmailReq) GetFrom() string {\n\tif x != nil {\n\t\treturn x.From\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetTo() string {\n\tif x != nil {\n\t\treturn x.To\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContentType() string {\n\tif x != nil {\n\t\treturn x.ContentType\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetSubject() string {\n\tif x != nil {\n\t\treturn x.Subject\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\ntype EmailResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmailResp) Reset() {\n\t*x = EmailResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailResp) ProtoMessage() {}\n\nfunc (x *EmailResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailResp.ProtoReflect.Descriptor instead.\nfunc (*EmailResp) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{1}\n}\n\nvar File_email_proto protoreflect.FileDescriptor\n\nvar file_email_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x08, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65,\n\t0x71, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x0b, 0x0a, 0x09,\n\t0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x32, 0x39, 0x0a, 0x0c, 0x45, 0x6d, 0x61,\n\t0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x53, 0x65, 0x6e,\n\t0x64, 0x12, 0x0f, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52,\n\t0x65, 0x71, 0x1a, 0x10, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c,\n\t0x52, 0x65, 0x73, 0x70, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63,\n\t0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_email_proto_rawDescOnce sync.Once\n\tfile_email_proto_rawDescData = file_email_proto_rawDesc\n)\n\nfunc file_email_proto_rawDescGZIP() []byte {\n\tfile_email_proto_rawDescOnce.Do(func() {\n\t\tfile_email_proto_rawDescData = protoimpl.X.CompressGZIP(file_email_proto_rawDescData)\n\t})\n\treturn file_email_proto_rawDescData\n}\n\nvar file_email_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_email_proto_goTypes = []interface{}{\n\t(*EmailReq)(nil),  // 0: email.EmailReq\n\t(*EmailResp)(nil), // 1: email.EmailResp\n}\nvar file_email_proto_depIdxs = []int32{\n\t0, // 0: email.EmailService.Send:input_type -> email.EmailReq\n\t1, // 1: email.EmailService.Send:output_type -> email.EmailResp\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_email_proto_init() }\nfunc file_email_proto_init() {\n\tif File_email_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_email_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_email_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_email_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_email_proto_goTypes,\n\t\tDependencyIndexes: file_email_proto_depIdxs,\n\t\tMessageInfos:      file_email_proto_msgTypes,\n\t}.Build()\n\tFile_email_proto = out.File\n\tfile_email_proto_rawDesc = nil\n\tfile_email_proto_goTypes = nil\n\tfile_email_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype EmailService interface {\n\tSend(ctx context.Context, req *EmailReq) (res *EmailResp, err error)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/email/emailservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEmailServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEmailServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kEmailServiceClient) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Send(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/email/emailservice/emailservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn emailServiceServiceInfo\n}\n\nvar emailServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"EmailService\"\n\thandlerType := (*email.EmailService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Send\": kitex.NewMethodInfo(sendHandler, newSendArgs, newSendResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"email\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc sendHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(email.EmailReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(email.EmailService).Send(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SendArgs:\n\t\tsuccess, err := handler.(email.EmailService).Send(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SendResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSendArgs() interface{} {\n\treturn &SendArgs{}\n}\n\nfunc newSendResult() interface{} {\n\treturn &SendResult{}\n}\n\ntype SendArgs struct {\n\tReq *email.EmailReq\n}\n\nfunc (p *SendArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(email.EmailReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SendArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SendArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SendArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SendArgs) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SendArgs_Req_DEFAULT *email.EmailReq\n\nfunc (p *SendArgs) GetReq() *email.EmailReq {\n\tif !p.IsSetReq() {\n\t\treturn SendArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SendArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SendArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SendResult struct {\n\tSuccess *email.EmailResp\n}\n\nvar SendResult_Success_DEFAULT *email.EmailResp\n\nfunc (p *SendResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(email.EmailResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SendResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SendResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SendResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SendResult) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SendResult) GetSuccess() *email.EmailResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SendResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SendResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*email.EmailResp)\n}\n\nfunc (p *SendResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SendResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Send(ctx context.Context, Req *email.EmailReq) (r *email.EmailResp, err error) {\n\tvar _args SendArgs\n\t_args.Req = Req\n\tvar _result SendResult\n\tif err = p.c.Call(ctx, \"Send\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/email/emailservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler email.EmailService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/email/emailservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler email.EmailService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/order/order.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage order\n\nimport (\n\tfmt \"fmt\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderReq[number], err)\n}\n\nfunc (x *PlaceOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *PlaceOrderReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderItem[number], err)\n}\n\nfunc (x *OrderItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v cart.CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Cost, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *OrderResult) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderResult[number], err)\n}\n\nfunc (x *OrderResult) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderResp[number], err)\n}\n\nfunc (x *PlaceOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderResult\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Order = &v\n\treturn offset, nil\n}\n\nfunc (x *ListOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderReq[number], err)\n}\n\nfunc (x *ListOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 7:\n\t\toffset, err = x.fastReadField7(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Order[number], err)\n}\n\nfunc (x *Order) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField7(buf []byte, _type int8) (offset int, err error) {\n\tx.CreatedAt, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderResp[number], err)\n}\n\nfunc (x *ListOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Order\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Orders = append(x.Orders, &v)\n\treturn offset, nil\n}\n\nfunc (x *MarkOrderPaidReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_MarkOrderPaidReq[number], err)\n}\n\nfunc (x *MarkOrderPaidReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *MarkOrderPaidReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *MarkOrderPaidResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 3, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *OrderItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItem())\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Cost == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 2, x.GetCost())\n\treturn offset\n}\n\nfunc (x *OrderResult) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderResult) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Order == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrder())\n\treturn offset\n}\n\nfunc (x *ListOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\toffset += x.fastWriteField7(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField2(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField3(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 3, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField6(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 6, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField7(buf []byte) (offset int) {\n\tif x.CreatedAt == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 7, x.GetCreatedAt())\n\treturn offset\n}\n\nfunc (x *ListOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Orders == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrders() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrders()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *MarkOrderPaidReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *MarkOrderPaidReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *MarkOrderPaidReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *MarkOrderPaidResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField2() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField3() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(3, x.GetAddress())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField5() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(5, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *OrderItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField1() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetItem())\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField2() (n int) {\n\tif x.Cost == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(2, x.GetCost())\n\treturn n\n}\n\nfunc (x *OrderResult) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *OrderResult) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) sizeField1() (n int) {\n\tif x.Order == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetOrder())\n\treturn n\n}\n\nfunc (x *ListOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\tn += x.sizeField7()\n\treturn n\n}\n\nfunc (x *Order) sizeField1() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *Order) sizeField2() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *Order) sizeField3() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(3, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) sizeField4() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *Order) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *Order) sizeField6() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(6, x.GetEmail())\n\treturn n\n}\n\nfunc (x *Order) sizeField7() (n int) {\n\tif x.CreatedAt == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(7, x.GetCreatedAt())\n\treturn n\n}\n\nfunc (x *ListOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderResp) sizeField1() (n int) {\n\tif x.Orders == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrders() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrders()[i])\n\t}\n\treturn n\n}\n\nfunc (x *MarkOrderPaidReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *MarkOrderPaidReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *MarkOrderPaidReq) sizeField2() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *MarkOrderPaidResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_PlaceOrderReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"UserCurrency\",\n\t3: \"Address\",\n\t4: \"Email\",\n\t5: \"OrderItems\",\n}\n\nvar fieldIDToName_OrderItem = map[int32]string{\n\t1: \"Item\",\n\t2: \"Cost\",\n}\n\nvar fieldIDToName_OrderResult = map[int32]string{\n\t1: \"OrderId\",\n}\n\nvar fieldIDToName_PlaceOrderResp = map[int32]string{\n\t1: \"Order\",\n}\n\nvar fieldIDToName_ListOrderReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_Order = map[int32]string{\n\t1: \"OrderItems\",\n\t2: \"OrderId\",\n\t3: \"UserId\",\n\t4: \"UserCurrency\",\n\t5: \"Address\",\n\t6: \"Email\",\n\t7: \"CreatedAt\",\n}\n\nvar fieldIDToName_ListOrderResp = map[int32]string{\n\t1: \"Orders\",\n}\n\nvar fieldIDToName_MarkOrderPaidReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"OrderId\",\n}\n\nvar fieldIDToName_MarkOrderPaidResp = map[int32]string{}\n\nvar _ = cart.File_cart_proto\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/order/order.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.1\n// source: order.proto\n\npackage order\n\nimport (\n\tcontext \"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       int32  `protobuf:\"varint,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() int32 {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn 0\n}\n\ntype PlaceOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId       uint32       `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,2,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,3,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tOrderItems   []*OrderItem `protobuf:\"bytes,5,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n}\n\nfunc (x *PlaceOrderReq) Reset() {\n\t*x = PlaceOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderReq) ProtoMessage() {}\n\nfunc (x *PlaceOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderReq.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *PlaceOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *PlaceOrderReq) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *PlaceOrderReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\ntype OrderItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItem *cart.CartItem `protobuf:\"bytes,1,opt,name=item,proto3\" json:\"item,omitempty\"`\n\tCost float32        `protobuf:\"fixed32,2,opt,name=cost,proto3\" json:\"cost,omitempty\"`\n}\n\nfunc (x *OrderItem) Reset() {\n\t*x = OrderItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderItem) ProtoMessage() {}\n\nfunc (x *OrderItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderItem.ProtoReflect.Descriptor instead.\nfunc (*OrderItem) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *OrderItem) GetItem() *cart.CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\nfunc (x *OrderItem) GetCost() float32 {\n\tif x != nil {\n\t\treturn x.Cost\n\t}\n\treturn 0\n}\n\ntype OrderResult struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n}\n\nfunc (x *OrderResult) Reset() {\n\t*x = OrderResult{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderResult) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderResult) ProtoMessage() {}\n\nfunc (x *OrderResult) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderResult.ProtoReflect.Descriptor instead.\nfunc (*OrderResult) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *OrderResult) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\ntype PlaceOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrder *OrderResult `protobuf:\"bytes,1,opt,name=order,proto3\" json:\"order,omitempty\"`\n}\n\nfunc (x *PlaceOrderResp) Reset() {\n\t*x = PlaceOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderResp) ProtoMessage() {}\n\nfunc (x *PlaceOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderResp.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PlaceOrderResp) GetOrder() *OrderResult {\n\tif x != nil {\n\t\treturn x.Order\n\t}\n\treturn nil\n}\n\ntype ListOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ListOrderReq) Reset() {\n\t*x = ListOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderReq) ProtoMessage() {}\n\nfunc (x *ListOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderReq.ProtoReflect.Descriptor instead.\nfunc (*ListOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ListOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype Order struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderItems   []*OrderItem `protobuf:\"bytes,1,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n\tOrderId      string       `protobuf:\"bytes,2,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId       uint32       `protobuf:\"varint,3,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,4,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,6,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tCreatedAt    int32        `protobuf:\"varint,7,opt,name=created_at,json=createdAt,proto3\" json:\"created_at,omitempty\"`\n}\n\nfunc (x *Order) Reset() {\n\t*x = Order{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Order) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Order) ProtoMessage() {}\n\nfunc (x *Order) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Order.ProtoReflect.Descriptor instead.\nfunc (*Order) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Order) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Order) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetCreatedAt() int32 {\n\tif x != nil {\n\t\treturn x.CreatedAt\n\t}\n\treturn 0\n}\n\ntype ListOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrders []*Order `protobuf:\"bytes,1,rep,name=orders,proto3\" json:\"orders,omitempty\"`\n}\n\nfunc (x *ListOrderResp) Reset() {\n\t*x = ListOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderResp) ProtoMessage() {}\n\nfunc (x *ListOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderResp.ProtoReflect.Descriptor instead.\nfunc (*ListOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ListOrderResp) GetOrders() []*Order {\n\tif x != nil {\n\t\treturn x.Orders\n\t}\n\treturn nil\n}\n\ntype MarkOrderPaidReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId  uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tOrderId string `protobuf:\"bytes,2,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n}\n\nfunc (x *MarkOrderPaidReq) Reset() {\n\t*x = MarkOrderPaidReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MarkOrderPaidReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MarkOrderPaidReq) ProtoMessage() {}\n\nfunc (x *MarkOrderPaidReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MarkOrderPaidReq.ProtoReflect.Descriptor instead.\nfunc (*MarkOrderPaidReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *MarkOrderPaidReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *MarkOrderPaidReq) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\ntype MarkOrderPaidResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *MarkOrderPaidResp) Reset() {\n\t*x = MarkOrderPaidResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MarkOrderPaidResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MarkOrderPaidResp) ProtoMessage() {}\n\nfunc (x *MarkOrderPaidResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MarkOrderPaidResp.ProtoReflect.Descriptor instead.\nfunc (*MarkOrderPaidResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{9}\n}\n\nvar File_order_proto protoreflect.FileDescriptor\n\nvar file_order_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x1a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a,\n\t0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,\n\t0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63,\n\t0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f,\n\t0x64, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65,\n\t0x72, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a,\n\t0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e,\n\t0x63, 0x79, 0x12, 0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05,\n\t0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d,\n\t0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e,\n\t0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x43, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74,\n\t0x65, 0x6d, 0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d,\n\t0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x28, 0x0a, 0x0b, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x22, 0x27, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf2, 0x01, 0x0a, 0x05, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65,\n\t0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65,\n\t0x72, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49,\n\t0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12,\n\t0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x35,\n\t0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12,\n\t0x24, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x0c, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x50, 0x61, 0x69, 0x64, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65,\n\t0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,\n\t0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x22, 0x13, 0x0a,\n\t0x11, 0x4d, 0x61, 0x72, 0x6b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x50, 0x61, 0x69, 0x64, 0x52, 0x65,\n\t0x73, 0x70, 0x32, 0xcb, 0x01, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65,\n\t0x72, 0x12, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f,\n\t0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e,\n\t0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x12, 0x38, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x13, 0x2e,\n\t0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52,\n\t0x65, 0x71, 0x1a, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f,\n\t0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0d, 0x4d, 0x61,\n\t0x72, 0x6b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x50, 0x61, 0x69, 0x64, 0x12, 0x17, 0x2e, 0x6f, 0x72,\n\t0x64, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x50, 0x61, 0x69,\n\t0x64, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72,\n\t0x6b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x50, 0x61, 0x69, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63,\n\t0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d,\n\t0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_order_proto_rawDescOnce sync.Once\n\tfile_order_proto_rawDescData = file_order_proto_rawDesc\n)\n\nfunc file_order_proto_rawDescGZIP() []byte {\n\tfile_order_proto_rawDescOnce.Do(func() {\n\t\tfile_order_proto_rawDescData = protoimpl.X.CompressGZIP(file_order_proto_rawDescData)\n\t})\n\treturn file_order_proto_rawDescData\n}\n\nvar file_order_proto_msgTypes = make([]protoimpl.MessageInfo, 10)\nvar file_order_proto_goTypes = []interface{}{\n\t(*Address)(nil),           // 0: order.Address\n\t(*PlaceOrderReq)(nil),     // 1: order.PlaceOrderReq\n\t(*OrderItem)(nil),         // 2: order.OrderItem\n\t(*OrderResult)(nil),       // 3: order.OrderResult\n\t(*PlaceOrderResp)(nil),    // 4: order.PlaceOrderResp\n\t(*ListOrderReq)(nil),      // 5: order.ListOrderReq\n\t(*Order)(nil),             // 6: order.Order\n\t(*ListOrderResp)(nil),     // 7: order.ListOrderResp\n\t(*MarkOrderPaidReq)(nil),  // 8: order.MarkOrderPaidReq\n\t(*MarkOrderPaidResp)(nil), // 9: order.MarkOrderPaidResp\n\t(*cart.CartItem)(nil),     // 10: cart.CartItem\n}\nvar file_order_proto_depIdxs = []int32{\n\t0,  // 0: order.PlaceOrderReq.address:type_name -> order.Address\n\t2,  // 1: order.PlaceOrderReq.order_items:type_name -> order.OrderItem\n\t10, // 2: order.OrderItem.item:type_name -> cart.CartItem\n\t3,  // 3: order.PlaceOrderResp.order:type_name -> order.OrderResult\n\t2,  // 4: order.Order.order_items:type_name -> order.OrderItem\n\t0,  // 5: order.Order.address:type_name -> order.Address\n\t6,  // 6: order.ListOrderResp.orders:type_name -> order.Order\n\t1,  // 7: order.OrderService.PlaceOrder:input_type -> order.PlaceOrderReq\n\t5,  // 8: order.OrderService.ListOrder:input_type -> order.ListOrderReq\n\t8,  // 9: order.OrderService.MarkOrderPaid:input_type -> order.MarkOrderPaidReq\n\t4,  // 10: order.OrderService.PlaceOrder:output_type -> order.PlaceOrderResp\n\t7,  // 11: order.OrderService.ListOrder:output_type -> order.ListOrderResp\n\t9,  // 12: order.OrderService.MarkOrderPaid:output_type -> order.MarkOrderPaidResp\n\t10, // [10:13] is the sub-list for method output_type\n\t7,  // [7:10] is the sub-list for method input_type\n\t7,  // [7:7] is the sub-list for extension type_name\n\t7,  // [7:7] is the sub-list for extension extendee\n\t0,  // [0:7] is the sub-list for field type_name\n}\n\nfunc init() { file_order_proto_init() }\nfunc file_order_proto_init() {\n\tif File_order_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_order_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderResult); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Order); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MarkOrderPaidReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MarkOrderPaidResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   10,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_proto_goTypes,\n\t\tDependencyIndexes: file_order_proto_depIdxs,\n\t\tMessageInfos:      file_order_proto_msgTypes,\n\t}.Build()\n\tFile_order_proto = out.File\n\tfile_order_proto_rawDesc = nil\n\tfile_order_proto_goTypes = nil\n\tfile_order_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype OrderService interface {\n\tPlaceOrder(ctx context.Context, req *PlaceOrderReq) (res *PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, req *ListOrderReq) (res *ListOrderResp, err error)\n\tMarkOrderPaid(ctx context.Context, req *MarkOrderPaidReq) (res *MarkOrderPaidResp, err error)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/order/orderservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n\tMarkOrderPaid(ctx context.Context, Req *order.MarkOrderPaidReq, callOptions ...callopt.Option) (r *order.MarkOrderPaidResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kOrderServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kOrderServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kOrderServiceClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.PlaceOrder(ctx, Req)\n}\n\nfunc (p *kOrderServiceClient) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListOrder(ctx, Req)\n}\n\nfunc (p *kOrderServiceClient) MarkOrderPaid(ctx context.Context, Req *order.MarkOrderPaidReq, callOptions ...callopt.Option) (r *order.MarkOrderPaidResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.MarkOrderPaid(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/order/orderservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler order.OrderService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/order/orderservice/orderservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn orderServiceServiceInfo\n}\n\nvar orderServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"OrderService\"\n\thandlerType := (*order.OrderService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"PlaceOrder\":    kitex.NewMethodInfo(placeOrderHandler, newPlaceOrderArgs, newPlaceOrderResult, false),\n\t\t\"ListOrder\":     kitex.NewMethodInfo(listOrderHandler, newListOrderArgs, newListOrderResult, false),\n\t\t\"MarkOrderPaid\": kitex.NewMethodInfo(markOrderPaidHandler, newMarkOrderPaidArgs, newMarkOrderPaidResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"order\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc placeOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.PlaceOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).PlaceOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *PlaceOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).PlaceOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*PlaceOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newPlaceOrderArgs() interface{} {\n\treturn &PlaceOrderArgs{}\n}\n\nfunc newPlaceOrderResult() interface{} {\n\treturn &PlaceOrderResult{}\n}\n\ntype PlaceOrderArgs struct {\n\tReq *order.PlaceOrderReq\n}\n\nfunc (p *PlaceOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.PlaceOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *PlaceOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *PlaceOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar PlaceOrderArgs_Req_DEFAULT *order.PlaceOrderReq\n\nfunc (p *PlaceOrderArgs) GetReq() *order.PlaceOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn PlaceOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *PlaceOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PlaceOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype PlaceOrderResult struct {\n\tSuccess *order.PlaceOrderResp\n}\n\nvar PlaceOrderResult_Success_DEFAULT *order.PlaceOrderResp\n\nfunc (p *PlaceOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.PlaceOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *PlaceOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *PlaceOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *PlaceOrderResult) GetSuccess() *order.PlaceOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn PlaceOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *PlaceOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.PlaceOrderResp)\n}\n\nfunc (p *PlaceOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PlaceOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc listOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.ListOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).ListOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).ListOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListOrderArgs() interface{} {\n\treturn &ListOrderArgs{}\n}\n\nfunc newListOrderResult() interface{} {\n\treturn &ListOrderResult{}\n}\n\ntype ListOrderArgs struct {\n\tReq *order.ListOrderReq\n}\n\nfunc (p *ListOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.ListOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListOrderArgs_Req_DEFAULT *order.ListOrderReq\n\nfunc (p *ListOrderArgs) GetReq() *order.ListOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn ListOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListOrderResult struct {\n\tSuccess *order.ListOrderResp\n}\n\nvar ListOrderResult_Success_DEFAULT *order.ListOrderResp\n\nfunc (p *ListOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.ListOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListOrderResult) GetSuccess() *order.ListOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.ListOrderResp)\n}\n\nfunc (p *ListOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc markOrderPaidHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.MarkOrderPaidReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).MarkOrderPaid(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *MarkOrderPaidArgs:\n\t\tsuccess, err := handler.(order.OrderService).MarkOrderPaid(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*MarkOrderPaidResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newMarkOrderPaidArgs() interface{} {\n\treturn &MarkOrderPaidArgs{}\n}\n\nfunc newMarkOrderPaidResult() interface{} {\n\treturn &MarkOrderPaidResult{}\n}\n\ntype MarkOrderPaidArgs struct {\n\tReq *order.MarkOrderPaidReq\n}\n\nfunc (p *MarkOrderPaidArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.MarkOrderPaidReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *MarkOrderPaidArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *MarkOrderPaidArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *MarkOrderPaidArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *MarkOrderPaidArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.MarkOrderPaidReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar MarkOrderPaidArgs_Req_DEFAULT *order.MarkOrderPaidReq\n\nfunc (p *MarkOrderPaidArgs) GetReq() *order.MarkOrderPaidReq {\n\tif !p.IsSetReq() {\n\t\treturn MarkOrderPaidArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *MarkOrderPaidArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *MarkOrderPaidArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype MarkOrderPaidResult struct {\n\tSuccess *order.MarkOrderPaidResp\n}\n\nvar MarkOrderPaidResult_Success_DEFAULT *order.MarkOrderPaidResp\n\nfunc (p *MarkOrderPaidResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.MarkOrderPaidResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *MarkOrderPaidResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *MarkOrderPaidResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *MarkOrderPaidResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *MarkOrderPaidResult) Unmarshal(in []byte) error {\n\tmsg := new(order.MarkOrderPaidResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *MarkOrderPaidResult) GetSuccess() *order.MarkOrderPaidResp {\n\tif !p.IsSetSuccess() {\n\t\treturn MarkOrderPaidResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *MarkOrderPaidResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.MarkOrderPaidResp)\n}\n\nfunc (p *MarkOrderPaidResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *MarkOrderPaidResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq) (r *order.PlaceOrderResp, err error) {\n\tvar _args PlaceOrderArgs\n\t_args.Req = Req\n\tvar _result PlaceOrderResult\n\tif err = p.c.Call(ctx, \"PlaceOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) ListOrder(ctx context.Context, Req *order.ListOrderReq) (r *order.ListOrderResp, err error) {\n\tvar _args ListOrderArgs\n\t_args.Req = Req\n\tvar _result ListOrderResult\n\tif err = p.c.Call(ctx, \"ListOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) MarkOrderPaid(ctx context.Context, Req *order.MarkOrderPaidReq) (r *order.MarkOrderPaidResp, err error) {\n\tvar _args MarkOrderPaidArgs\n\t_args.Req = Req\n\tvar _result MarkOrderPaidResult\n\tif err = p.c.Call(ctx, \"MarkOrderPaid\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/order/orderservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler order.OrderService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/payment/payment.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage payment\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CreditCardInfo) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CreditCardInfo[number], err)\n}\n\nfunc (x *CreditCardInfo) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardNumber, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardCvv, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationYear, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationMonth, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeReq[number], err)\n}\n\nfunc (x *ChargeReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Amount, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *ChargeReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeResp[number], err)\n}\n\nfunc (x *ChargeResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField1(buf []byte) (offset int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetCreditCardNumber())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetCreditCardCvv())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField3(buf []byte) (offset int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 3, x.GetCreditCardExpirationYear())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField4(buf []byte) (offset int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 4, x.GetCreditCardExpirationMonth())\n\treturn offset\n}\n\nfunc (x *ChargeReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Amount == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 1, x.GetAmount())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 4, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *ChargeResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField1() (n int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetCreditCardNumber())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField2() (n int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetCreditCardCvv())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField3() (n int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(3, x.GetCreditCardExpirationYear())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField4() (n int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(4, x.GetCreditCardExpirationMonth())\n\treturn n\n}\n\nfunc (x *ChargeReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField1() (n int) {\n\tif x.Amount == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(1, x.GetAmount())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField2() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField3() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField4() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(4, x.GetUserId())\n\treturn n\n}\n\nfunc (x *ChargeResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ChargeResp) sizeField1() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_CreditCardInfo = map[int32]string{\n\t1: \"CreditCardNumber\",\n\t2: \"CreditCardCvv\",\n\t3: \"CreditCardExpirationYear\",\n\t4: \"CreditCardExpirationMonth\",\n}\n\nvar fieldIDToName_ChargeReq = map[int32]string{\n\t1: \"Amount\",\n\t2: \"CreditCard\",\n\t3: \"OrderId\",\n\t4: \"UserId\",\n}\n\nvar fieldIDToName_ChargeResp = map[int32]string{\n\t1: \"TransactionId\",\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/payment/payment.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.1\n// source: payment.proto\n\npackage payment\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CreditCardInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCreditCardNumber          string `protobuf:\"bytes,1,opt,name=credit_card_number,json=creditCardNumber,proto3\" json:\"credit_card_number,omitempty\"`\n\tCreditCardCvv             int32  `protobuf:\"varint,2,opt,name=credit_card_cvv,json=creditCardCvv,proto3\" json:\"credit_card_cvv,omitempty\"`\n\tCreditCardExpirationYear  int32  `protobuf:\"varint,3,opt,name=credit_card_expiration_year,json=creditCardExpirationYear,proto3\" json:\"credit_card_expiration_year,omitempty\"`\n\tCreditCardExpirationMonth int32  `protobuf:\"varint,4,opt,name=credit_card_expiration_month,json=creditCardExpirationMonth,proto3\" json:\"credit_card_expiration_month,omitempty\"`\n}\n\nfunc (x *CreditCardInfo) Reset() {\n\t*x = CreditCardInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreditCardInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreditCardInfo) ProtoMessage() {}\n\nfunc (x *CreditCardInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreditCardInfo.ProtoReflect.Descriptor instead.\nfunc (*CreditCardInfo) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreditCardInfo) GetCreditCardNumber() string {\n\tif x != nil {\n\t\treturn x.CreditCardNumber\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreditCardInfo) GetCreditCardCvv() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardCvv\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationMonth\n\t}\n\treturn 0\n}\n\ntype ChargeReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAmount     float32         `protobuf:\"fixed32,1,opt,name=amount,proto3\" json:\"amount,omitempty\"`\n\tCreditCard *CreditCardInfo `protobuf:\"bytes,2,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n\tOrderId    string          `protobuf:\"bytes,3,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId     uint32          `protobuf:\"varint,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ChargeReq) Reset() {\n\t*x = ChargeReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeReq) ProtoMessage() {}\n\nfunc (x *ChargeReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeReq.ProtoReflect.Descriptor instead.\nfunc (*ChargeReq) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ChargeReq) GetAmount() float32 {\n\tif x != nil {\n\t\treturn x.Amount\n\t}\n\treturn 0\n}\n\nfunc (x *ChargeReq) GetCreditCard() *CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\nfunc (x *ChargeReq) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *ChargeReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype ChargeResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTransactionId string `protobuf:\"bytes,1,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *ChargeResp) Reset() {\n\t*x = ChargeResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeResp) ProtoMessage() {}\n\nfunc (x *ChargeResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeResp.ProtoReflect.Descriptor instead.\nfunc (*ChargeResp) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ChargeResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_payment_proto protoreflect.FileDescriptor\n\nvar file_payment_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x12, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65,\n\t0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43,\n\t0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x76, 0x76, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x43, 0x76,\n\t0x76, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61, 0x72,\n\t0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f,\n\t0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x6e, 0x74,\n\t0x68, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12,\n\t0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52,\n\t0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69,\n\t0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,\n\t0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,\n\t0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75,\n\t0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61,\n\t0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x45, 0x0a, 0x0e, 0x50, 0x61,\n\t0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x06,\n\t0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x61, 0x79,\n\t0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_payment_proto_rawDescOnce sync.Once\n\tfile_payment_proto_rawDescData = file_payment_proto_rawDesc\n)\n\nfunc file_payment_proto_rawDescGZIP() []byte {\n\tfile_payment_proto_rawDescOnce.Do(func() {\n\t\tfile_payment_proto_rawDescData = protoimpl.X.CompressGZIP(file_payment_proto_rawDescData)\n\t})\n\treturn file_payment_proto_rawDescData\n}\n\nvar file_payment_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_payment_proto_goTypes = []interface{}{\n\t(*CreditCardInfo)(nil), // 0: payment.CreditCardInfo\n\t(*ChargeReq)(nil),      // 1: payment.ChargeReq\n\t(*ChargeResp)(nil),     // 2: payment.ChargeResp\n}\nvar file_payment_proto_depIdxs = []int32{\n\t0, // 0: payment.ChargeReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 1: payment.PaymentService.Charge:input_type -> payment.ChargeReq\n\t2, // 2: payment.PaymentService.Charge:output_type -> payment.ChargeResp\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_payment_proto_init() }\nfunc file_payment_proto_init() {\n\tif File_payment_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_payment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreditCardInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_payment_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_payment_proto_goTypes,\n\t\tDependencyIndexes: file_payment_proto_depIdxs,\n\t\tMessageInfos:      file_payment_proto_msgTypes,\n\t}.Build()\n\tFile_payment_proto = out.File\n\tfile_payment_proto_rawDesc = nil\n\tfile_payment_proto_goTypes = nil\n\tfile_payment_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype PaymentService interface {\n\tCharge(ctx context.Context, req *ChargeReq) (res *ChargeResp, err error)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/payment/paymentservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kPaymentServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kPaymentServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kPaymentServiceClient) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Charge(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/payment/paymentservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler payment.PaymentService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/payment/paymentservice/paymentservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfo\n}\n\nvar paymentServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"PaymentService\"\n\thandlerType := (*payment.PaymentService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Charge\": kitex.NewMethodInfo(chargeHandler, newChargeArgs, newChargeResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"payment\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc chargeHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(payment.ChargeReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(payment.PaymentService).Charge(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ChargeArgs:\n\t\tsuccess, err := handler.(payment.PaymentService).Charge(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ChargeResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newChargeArgs() interface{} {\n\treturn &ChargeArgs{}\n}\n\nfunc newChargeResult() interface{} {\n\treturn &ChargeResult{}\n}\n\ntype ChargeArgs struct {\n\tReq *payment.ChargeReq\n}\n\nfunc (p *ChargeArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(payment.ChargeReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ChargeArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ChargeArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ChargeArgs) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ChargeArgs_Req_DEFAULT *payment.ChargeReq\n\nfunc (p *ChargeArgs) GetReq() *payment.ChargeReq {\n\tif !p.IsSetReq() {\n\t\treturn ChargeArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ChargeArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ChargeArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ChargeResult struct {\n\tSuccess *payment.ChargeResp\n}\n\nvar ChargeResult_Success_DEFAULT *payment.ChargeResp\n\nfunc (p *ChargeResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(payment.ChargeResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ChargeResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ChargeResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ChargeResult) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ChargeResult) GetSuccess() *payment.ChargeResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ChargeResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ChargeResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*payment.ChargeResp)\n}\n\nfunc (p *ChargeResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ChargeResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Charge(ctx context.Context, Req *payment.ChargeReq) (r *payment.ChargeResp, err error) {\n\tvar _args ChargeArgs\n\t_args.Req = Req\n\tvar _result ChargeResult\n\tif err = p.c.Call(ctx, \"Charge\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/payment/paymentservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler payment.PaymentService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/product/product.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *ListProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsReq[number], err)\n}\n\nfunc (x *ListProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Page, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.PageSize, offset, err = fastpb.ReadInt64(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CategoryName, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Product[number], err)\n}\n\nfunc (x *Product) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Name, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Description, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Picture, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Price, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v string\n\tv, offset, err = fastpb.ReadString(buf, _type)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Categories = append(x.Categories, v)\n\treturn offset, err\n}\n\nfunc (x *ListProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsResp[number], err)\n}\n\nfunc (x *ListProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Products = append(x.Products, &v)\n\treturn offset, nil\n}\n\nfunc (x *GetProductReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductReq[number], err)\n}\n\nfunc (x *GetProductReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetProductResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductResp[number], err)\n}\n\nfunc (x *GetProductResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Product = &v\n\treturn offset, nil\n}\n\nfunc (x *SearchProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsReq[number], err)\n}\n\nfunc (x *SearchProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Query, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *SearchProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsResp[number], err)\n}\n\nfunc (x *SearchProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Results = append(x.Results, &v)\n\treturn offset, nil\n}\n\nfunc (x *ListProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Page == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetPage())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.PageSize == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt64(buf[offset:], 2, x.GetPageSize())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.CategoryName == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetCategoryName())\n\treturn offset\n}\n\nfunc (x *Product) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField2(buf []byte) (offset int) {\n\tif x.Name == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetName())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField3(buf []byte) (offset int) {\n\tif x.Description == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetDescription())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField4(buf []byte) (offset int) {\n\tif x.Picture == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetPicture())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField5(buf []byte) (offset int) {\n\tif x.Price == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 5, x.GetPrice())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField6(buf []byte) (offset int) {\n\tif len(x.Categories) == 0 {\n\t\treturn offset\n\t}\n\tfor i := range x.GetCategories() {\n\t\toffset += fastpb.WriteString(buf[offset:], 6, x.GetCategories()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Products == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetProducts() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProducts()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *GetProductReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *GetProductResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Product == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProduct())\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Query == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetQuery())\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Results == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetResults() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetResults()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField1() (n int) {\n\tif x.Page == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetPage())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField2() (n int) {\n\tif x.PageSize == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt64(2, x.GetPageSize())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField3() (n int) {\n\tif x.CategoryName == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetCategoryName())\n\treturn n\n}\n\nfunc (x *Product) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Product) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *Product) sizeField2() (n int) {\n\tif x.Name == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetName())\n\treturn n\n}\n\nfunc (x *Product) sizeField3() (n int) {\n\tif x.Description == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetDescription())\n\treturn n\n}\n\nfunc (x *Product) sizeField4() (n int) {\n\tif x.Picture == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetPicture())\n\treturn n\n}\n\nfunc (x *Product) sizeField5() (n int) {\n\tif x.Price == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(5, x.GetPrice())\n\treturn n\n}\n\nfunc (x *Product) sizeField6() (n int) {\n\tif len(x.Categories) == 0 {\n\t\treturn n\n\t}\n\tfor i := range x.GetCategories() {\n\t\tn += fastpb.SizeString(6, x.GetCategories()[i])\n\t}\n\treturn n\n}\n\nfunc (x *ListProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListProductsResp) sizeField1() (n int) {\n\tif x.Products == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetProducts() {\n\t\tn += fastpb.SizeMessage(1, x.GetProducts()[i])\n\t}\n\treturn n\n}\n\nfunc (x *GetProductReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductReq) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *GetProductResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductResp) sizeField1() (n int) {\n\tif x.Product == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetProduct())\n\treturn n\n}\n\nfunc (x *SearchProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsReq) sizeField1() (n int) {\n\tif x.Query == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetQuery())\n\treturn n\n}\n\nfunc (x *SearchProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsResp) sizeField1() (n int) {\n\tif x.Results == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetResults() {\n\t\tn += fastpb.SizeMessage(1, x.GetResults()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_ListProductsReq = map[int32]string{\n\t1: \"Page\",\n\t2: \"PageSize\",\n\t3: \"CategoryName\",\n}\n\nvar fieldIDToName_Product = map[int32]string{\n\t1: \"Id\",\n\t2: \"Name\",\n\t3: \"Description\",\n\t4: \"Picture\",\n\t5: \"Price\",\n\t6: \"Categories\",\n}\n\nvar fieldIDToName_ListProductsResp = map[int32]string{\n\t1: \"Products\",\n}\n\nvar fieldIDToName_GetProductReq = map[int32]string{\n\t1: \"Id\",\n}\n\nvar fieldIDToName_GetProductResp = map[int32]string{\n\t1: \"Product\",\n}\n\nvar fieldIDToName_SearchProductsReq = map[int32]string{\n\t1: \"Query\",\n}\n\nvar fieldIDToName_SearchProductsResp = map[int32]string{\n\t1: \"Results\",\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/product/product.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.1\n// source: product.proto\n\npackage product\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPage         int32  `protobuf:\"varint,1,opt,name=page,proto3\" json:\"page,omitempty\"`\n\tPageSize     int64  `protobuf:\"varint,2,opt,name=pageSize,proto3\" json:\"pageSize,omitempty\"`\n\tCategoryName string `protobuf:\"bytes,3,opt,name=categoryName,proto3\" json:\"categoryName,omitempty\"`\n}\n\nfunc (x *ListProductsReq) Reset() {\n\t*x = ListProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsReq) ProtoMessage() {}\n\nfunc (x *ListProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsReq.ProtoReflect.Descriptor instead.\nfunc (*ListProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListProductsReq) GetPage() int32 {\n\tif x != nil {\n\t\treturn x.Page\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetPageSize() int64 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetCategoryName() string {\n\tif x != nil {\n\t\treturn x.CategoryName\n\t}\n\treturn \"\"\n}\n\ntype Product struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          uint32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string   `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tPicture     string   `protobuf:\"bytes,4,opt,name=picture,proto3\" json:\"picture,omitempty\"`\n\tPrice       float32  `protobuf:\"fixed32,5,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tCategories  []string `protobuf:\"bytes,6,rep,name=categories,proto3\" json:\"categories,omitempty\"`\n}\n\nfunc (x *Product) Reset() {\n\t*x = Product{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Product) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Product) ProtoMessage() {}\n\nfunc (x *Product) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Product.ProtoReflect.Descriptor instead.\nfunc (*Product) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Product) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPicture() string {\n\tif x != nil {\n\t\treturn x.Picture\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPrice() float32 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetCategories() []string {\n\tif x != nil {\n\t\treturn x.Categories\n\t}\n\treturn nil\n}\n\ntype ListProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProducts []*Product `protobuf:\"bytes,1,rep,name=products,proto3\" json:\"products,omitempty\"`\n}\n\nfunc (x *ListProductsResp) Reset() {\n\t*x = ListProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsResp) ProtoMessage() {}\n\nfunc (x *ListProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsResp.ProtoReflect.Descriptor instead.\nfunc (*ListProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListProductsResp) GetProducts() []*Product {\n\tif x != nil {\n\t\treturn x.Products\n\t}\n\treturn nil\n}\n\ntype GetProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetProductReq) Reset() {\n\t*x = GetProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductReq) ProtoMessage() {}\n\nfunc (x *GetProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductReq.ProtoReflect.Descriptor instead.\nfunc (*GetProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetProductResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProduct *Product `protobuf:\"bytes,1,opt,name=product,proto3\" json:\"product,omitempty\"`\n}\n\nfunc (x *GetProductResp) Reset() {\n\t*x = GetProductResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductResp) ProtoMessage() {}\n\nfunc (x *GetProductResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductResp.ProtoReflect.Descriptor instead.\nfunc (*GetProductResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetProductResp) GetProduct() *Product {\n\tif x != nil {\n\t\treturn x.Product\n\t}\n\treturn nil\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *SearchProductsReq) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\ntype SearchProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*Product `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *SearchProductsResp) Reset() {\n\t*x = SearchProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsResp) ProtoMessage() {}\n\nfunc (x *SearchProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsResp.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SearchProductsResp) GetResults() []*Product {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_product_proto protoreflect.FileDescriptor\n\nvar file_product_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x65, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12,\n\t0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63,\n\t0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22,\n\t0x9f, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70,\n\t0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63,\n\t0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18,\n\t0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65,\n\t0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,\n\t0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x40, 0x0a,\n\t0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x32,\n\t0xec, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x61, 0x74, 0x61, 0x6c,\n\t0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x4c, 0x69, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x12, 0x3f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x16,\n\t0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x12, 0x4b, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65,\n\t0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x1a,\n\t0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x40,\n\t0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b,\n\t0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_proto_rawDescOnce sync.Once\n\tfile_product_proto_rawDescData = file_product_proto_rawDesc\n)\n\nfunc file_product_proto_rawDescGZIP() []byte {\n\tfile_product_proto_rawDescOnce.Do(func() {\n\t\tfile_product_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_proto_rawDescData)\n\t})\n\treturn file_product_proto_rawDescData\n}\n\nvar file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_product_proto_goTypes = []interface{}{\n\t(*ListProductsReq)(nil),    // 0: product.ListProductsReq\n\t(*Product)(nil),            // 1: product.Product\n\t(*ListProductsResp)(nil),   // 2: product.ListProductsResp\n\t(*GetProductReq)(nil),      // 3: product.GetProductReq\n\t(*GetProductResp)(nil),     // 4: product.GetProductResp\n\t(*SearchProductsReq)(nil),  // 5: product.SearchProductsReq\n\t(*SearchProductsResp)(nil), // 6: product.SearchProductsResp\n}\nvar file_product_proto_depIdxs = []int32{\n\t1, // 0: product.ListProductsResp.products:type_name -> product.Product\n\t1, // 1: product.GetProductResp.product:type_name -> product.Product\n\t1, // 2: product.SearchProductsResp.results:type_name -> product.Product\n\t0, // 3: product.ProductCatalogService.ListProducts:input_type -> product.ListProductsReq\n\t3, // 4: product.ProductCatalogService.GetProduct:input_type -> product.GetProductReq\n\t5, // 5: product.ProductCatalogService.SearchProducts:input_type -> product.SearchProductsReq\n\t2, // 6: product.ProductCatalogService.ListProducts:output_type -> product.ListProductsResp\n\t4, // 7: product.ProductCatalogService.GetProduct:output_type -> product.GetProductResp\n\t6, // 8: product.ProductCatalogService.SearchProducts:output_type -> product.SearchProductsResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_product_proto_init() }\nfunc file_product_proto_init() {\n\tif File_product_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Product); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_proto_goTypes,\n\t\tDependencyIndexes: file_product_proto_depIdxs,\n\t\tMessageInfos:      file_product_proto_msgTypes,\n\t}.Build()\n\tFile_product_proto = out.File\n\tfile_product_proto_rawDesc = nil\n\tfile_product_proto_goTypes = nil\n\tfile_product_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype ProductCatalogService interface {\n\tListProducts(ctx context.Context, req *ListProductsReq) (res *ListProductsResp, err error)\n\tGetProduct(ctx context.Context, req *GetProductReq) (res *GetProductResp, err error)\n\tSearchProducts(ctx context.Context, req *SearchProductsReq) (res *SearchProductsResp, err error)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/product/productcatalogservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductCatalogServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductCatalogServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductCatalogServiceClient) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.SearchProducts(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/product/productcatalogservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductCatalogService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/product/productcatalogservice/productcatalogservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfo\n}\n\nvar productCatalogServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"ProductCatalogService\"\n\thandlerType := (*product.ProductCatalogService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"ListProducts\":   kitex.NewMethodInfo(listProductsHandler, newListProductsArgs, newListProductsResult, false),\n\t\t\"GetProduct\":     kitex.NewMethodInfo(getProductHandler, newGetProductArgs, newGetProductResult, false),\n\t\t\"SearchProducts\": kitex.NewMethodInfo(searchProductsHandler, newSearchProductsArgs, newSearchProductsResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"product\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.ListProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).ListProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).ListProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListProductsArgs() interface{} {\n\treturn &ListProductsArgs{}\n}\n\nfunc newListProductsResult() interface{} {\n\treturn &ListProductsResult{}\n}\n\ntype ListProductsArgs struct {\n\tReq *product.ListProductsReq\n}\n\nfunc (p *ListProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.ListProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListProductsArgs_Req_DEFAULT *product.ListProductsReq\n\nfunc (p *ListProductsArgs) GetReq() *product.ListProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn ListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListProductsResult struct {\n\tSuccess *product.ListProductsResp\n}\n\nvar ListProductsResult_Success_DEFAULT *product.ListProductsResp\n\nfunc (p *ListProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.ListProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListProductsResult) GetSuccess() *product.ListProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.ListProductsResp)\n}\n\nfunc (p *ListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.GetProductReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).GetProduct(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetProductArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).GetProduct(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetProductResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetProductArgs() interface{} {\n\treturn &GetProductArgs{}\n}\n\nfunc newGetProductResult() interface{} {\n\treturn &GetProductResult{}\n}\n\ntype GetProductArgs struct {\n\tReq *product.GetProductReq\n}\n\nfunc (p *GetProductArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.GetProductReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetProductArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetProductArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetProductArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetProductArgs_Req_DEFAULT *product.GetProductReq\n\nfunc (p *GetProductArgs) GetReq() *product.GetProductReq {\n\tif !p.IsSetReq() {\n\t\treturn GetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetProductResult struct {\n\tSuccess *product.GetProductResp\n}\n\nvar GetProductResult_Success_DEFAULT *product.GetProductResp\n\nfunc (p *GetProductResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.GetProductResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetProductResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetProductResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetProductResult) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetProductResult) GetSuccess() *product.GetProductResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.GetProductResp)\n}\n\nfunc (p *GetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc searchProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.SearchProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).SearchProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SearchProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).SearchProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SearchProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSearchProductsArgs() interface{} {\n\treturn &SearchProductsArgs{}\n}\n\nfunc newSearchProductsResult() interface{} {\n\treturn &SearchProductsResult{}\n}\n\ntype SearchProductsArgs struct {\n\tReq *product.SearchProductsReq\n}\n\nfunc (p *SearchProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.SearchProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SearchProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SearchProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SearchProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SearchProductsArgs_Req_DEFAULT *product.SearchProductsReq\n\nfunc (p *SearchProductsArgs) GetReq() *product.SearchProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn SearchProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SearchProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SearchProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SearchProductsResult struct {\n\tSuccess *product.SearchProductsResp\n}\n\nvar SearchProductsResult_Success_DEFAULT *product.SearchProductsResp\n\nfunc (p *SearchProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.SearchProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SearchProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SearchProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SearchProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SearchProductsResult) GetSuccess() *product.SearchProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SearchProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SearchProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.SearchProductsResp)\n}\n\nfunc (p *SearchProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SearchProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, Req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args ListProductsArgs\n\t_args.Req = Req\n\tvar _result ListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, Req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args GetProductArgs\n\t_args.Req = Req\n\tvar _result GetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq) (r *product.SearchProductsResp, err error) {\n\tvar _args SearchProductsArgs\n\t_args.Req = Req\n\tvar _result SearchProductsResult\n\tif err = p.c.Call(ctx, \"SearchProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/product/productcatalogservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductCatalogService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ConfirmPassword, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetConfirmPassword())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetConfirmPassword())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"ConfirmPassword\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Register\": kitex.NewMethodInfo(registerHandler, newRegisterArgs, newRegisterResult, false),\n\t\t\"Login\":    kitex.NewMethodInfo(loginHandler, newLoginArgs, newLoginResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"user\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/cart/cart_client.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() cartservice.Client\n\tService() string\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := cartservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient cartservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() cartservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\treturn c.kitexClient.AddItem(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\treturn c.kitexClient.GetCart(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\treturn c.kitexClient.EmptyCart(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/cart/cart_default.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc AddItem(ctx context.Context, req *cart.AddItemReq, callOptions ...callopt.Option) (resp *cart.AddItemResp, err error) {\n\tresp, err = defaultClient.AddItem(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"AddItem call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetCart(ctx context.Context, req *cart.GetCartReq, callOptions ...callopt.Option) (resp *cart.GetCartResp, err error) {\n\tresp, err = defaultClient.GetCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc EmptyCart(ctx context.Context, req *cart.EmptyCartReq, callOptions ...callopt.Option) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = defaultClient.EmptyCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"EmptyCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/cart/cart_init.go",
    "content": "package cart\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"cart\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/checkout/checkout_client.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() checkoutservice.Client\n\tService() string\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := checkoutservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient checkoutservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() checkoutservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\treturn c.kitexClient.Checkout(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/checkout/checkout_default.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Checkout(ctx context.Context, req *checkout.CheckoutReq, callOptions ...callopt.Option) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = defaultClient.Checkout(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Checkout call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/checkout/checkout_init.go",
    "content": "package checkout\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"checkout\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/email/email_client.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() emailservice.Client\n\tService() string\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := emailservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient emailservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() emailservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\treturn c.kitexClient.Send(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/email/email_default.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Send(ctx context.Context, req *email.EmailReq, callOptions ...callopt.Option) (resp *email.EmailResp, err error) {\n\tresp, err = defaultClient.Send(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Send call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/email/email_init.go",
    "content": "package email\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"email\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/order/order_client.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() orderservice.Client\n\tService() string\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n\tMarkOrderPaid(ctx context.Context, Req *order.MarkOrderPaidReq, callOptions ...callopt.Option) (r *order.MarkOrderPaidResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := orderservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient orderservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() orderservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\treturn c.kitexClient.PlaceOrder(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\treturn c.kitexClient.ListOrder(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) MarkOrderPaid(ctx context.Context, Req *order.MarkOrderPaidReq, callOptions ...callopt.Option) (r *order.MarkOrderPaidResp, err error) {\n\treturn c.kitexClient.MarkOrderPaid(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/order/order_default.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc PlaceOrder(ctx context.Context, req *order.PlaceOrderReq, callOptions ...callopt.Option) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = defaultClient.PlaceOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"PlaceOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc ListOrder(ctx context.Context, req *order.ListOrderReq, callOptions ...callopt.Option) (resp *order.ListOrderResp, err error) {\n\tresp, err = defaultClient.ListOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc MarkOrderPaid(ctx context.Context, req *order.MarkOrderPaidReq, callOptions ...callopt.Option) (resp *order.MarkOrderPaidResp, err error) {\n\tresp, err = defaultClient.MarkOrderPaid(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"MarkOrderPaid call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/order/order_init.go",
    "content": "package order\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"order\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/payment/payment_client.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() paymentservice.Client\n\tService() string\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := paymentservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient paymentservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() paymentservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\treturn c.kitexClient.Charge(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/payment/payment_default.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Charge(ctx context.Context, req *payment.ChargeReq, callOptions ...callopt.Option) (resp *payment.ChargeResp, err error) {\n\tresp, err = defaultClient.Charge(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Charge call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/payment/payment_init.go",
    "content": "package payment\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"payment\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/product/product_client.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() productcatalogservice.Client\n\tService() string\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := productcatalogservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient productcatalogservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() productcatalogservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\treturn c.kitexClient.ListProducts(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\treturn c.kitexClient.GetProduct(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\treturn c.kitexClient.SearchProducts(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/product/product_default.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (resp *product.ListProductsResp, err error) {\n\tresp, err = defaultClient.ListProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (resp *product.GetProductResp, err error) {\n\tresp, err = defaultClient.GetProduct(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetProduct call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc SearchProducts(ctx context.Context, req *product.SearchProductsReq, callOptions ...callopt.Option) (resp *product.SearchProductsResp, err error) {\n\tresp, err = defaultClient.SearchProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"SearchProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/product/product_init.go",
    "content": "package product\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"product\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/scripts/copy_env.sh",
    "content": "#!/bin/bash\n\n. scripts/list_app.sh\n\nget_app_list\n\nreadonly root_path=`pwd`\nfor app_path in ${app_list[*]}; do\n  if [[ \"${app_path}\" = \"app/common\" ]]; then\n    continue\n  fi\n  if [[  -e \"${app_path}/.env\" ]]; then\n      continue\n    fi\n  echo \"copy ${app_path} env file\"\n  cp \"${app_path}/.env.example\" \"${app_path}/.env\"\n  echo \"Done! Please replace the real value\"\ndone"
  },
  {
    "path": "gomall/scripts/fix.sh",
    "content": "#!/bin/bash\n\nset -ex\n\nsource scripts/list_app.sh\n\nget_app_list\n\nfor app_path in ${app_list[*]}; do\n    cd ${app_path} && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m && cd ../../\ndone\n"
  },
  {
    "path": "gomall/scripts/gen.sh",
    "content": "#!/bin/bash\n\nsvcName=${1}\n\ncd app/${svcName}\ncwgo client -I ../../idl --type RPC --service ${svcName} --module github.com/cloudwego/biz-demo/gomall/app/${svcName} --idl ../../idl/${svcName}.proto\ncwgo server -I ../../idl --type RPC --service ${svcName} --module github.com/cloudwego/biz-demo/gomall/app/${svcName} --idl ../../idl/${svcName}.proto\n"
  },
  {
    "path": "gomall/scripts/list_app.sh",
    "content": "#!/bin/bash\n\nreadonly dir=\"\"\n\napp_list=()\n\nget_app_list(){\n    local idx=0\n    for d in app/*; do\n        if [ -d \"$d\" ] ; then\n            app_list[idx]=$d\n            idx+=1\n        fi\n    done\n}"
  },
  {
    "path": "gomall/scripts/run.sh",
    "content": "#!/bin/bash\n\nsvcName=${1}\n\nif [ -d \"app/${svcName}\" ];then\n    cd app/${svcName} && air\nfi\n"
  },
  {
    "path": "gomall/scripts/run_all.sh",
    "content": "#!/bin/bash\n\n. scripts/list_app.sh\n\nget_app_list\n\nreadonly root_path=`pwd`\nfor app_path in ${app_list[*]}; do\n    # nohup go run ${root_path}/${app_path}/*.go &\ndone"
  },
  {
    "path": "gomall/scripts/tidy.sh",
    "content": "#!/bin/bash\n\n. scripts/list_app.sh\n\nget_app_list\n\nreadonly root_path=`pwd`\nfor app_path in ${app_list[*]}; do\n    cd \"${root_path}/${app_path}\" &&  go mod tidy \ndone"
  },
  {
    "path": "gomall/scripts/vet.sh",
    "content": "#!/bin/bash\n\n. scripts/list_app.sh\n\nget_app_list\n\nreadonly root_path=`pwd`\nfor app_path in ${app_list[*]}; do\n    go vet ${root_path}/${app_path}\ndone"
  },
  {
    "path": "gomall/tutorial/README.md",
    "content": "# Gomall\nThis is the Gomall tutorial. We make project evolution record for you, and help you learn it step by step."
  },
  {
    "path": "gomall/tutorial/ch01/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse ./hello_world\n"
  },
  {
    "path": "gomall/tutorial/ch01/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 // indirect\n\tgithub.com/bytedance/sonic v1.8.1 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.0 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.0.9 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.27.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch01/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 h1:PtwsQyQJGxf8iaPptPNaduEIu9BnrNms+pcRdHAxZaM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1 h1:NqAHCaGaTzro0xMmnTCLUyRlbEP6r8MCA1cJUrH3Pu4=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0 h1:oRrOp58cPCvK2QbMozZNDESvrxQaEHW2dCimmwH1lcU=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch01/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/Makefile",
    "content": ".PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch02/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch02/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch02/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch02/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch02/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch02/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch02/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch03/Makefile",
    "content": ".PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch03/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch03/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n"
  },
  {
    "path": "gomall/tutorial/ch03/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch03/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch03/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch03/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch03/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch03/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch04/Makefile",
    "content": ".PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch04/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch04/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n"
  },
  {
    "path": "gomall/tutorial/ch04/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch04/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch04/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch04/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch04/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch04/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch05/Makefile",
    "content": ".PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(&model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"uniqueIndex;type:varchar(128) not null\"`\n\tPassword string `gorm:\"type:varchar(64) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\t// CURD\n\n\t// Create\n\t// mysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"jfiojffjsoij\"})\n\n\t// Update\n\t// mysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").Update(\"password\", \"22222222\")\n\n\t// Read\n\tvar row model.User\n\tmysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").First(&row)\n\n\tfmt.Printf(\"row: %+v\\n\", row)\n\n\t// Delete\n\t// mysql.DB.Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n\n\t// mysql.DB.Unscoped().Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch05/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch05/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n      - MYSQL_DATABASE=demo_proto"
  },
  {
    "path": "gomall/tutorial/ch05/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch05/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch05/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch05/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch05/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch05/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch06/Makefile",
    "content": ".PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(&model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"uniqueIndex;type:varchar(128) not null\"`\n\tPassword string `gorm:\"type:varchar(64) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\t// CURD\n\n\t// Create\n\t// mysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"jfiojffjsoij\"})\n\n\t// Update\n\t// mysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").Update(\"password\", \"22222222\")\n\n\t// Read\n\tvar row model.User\n\tmysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").First(&row)\n\n\tfmt.Printf(\"row: %+v\\n\", row)\n\n\t// Delete\n\t// mysql.DB.Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n\n\t// mysql.DB.Unscoped().Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch06/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch06/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n      - MYSQL_DATABASE=demo_proto"
  },
  {
    "path": "gomall/tutorial/ch06/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch06/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch06/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch06/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch06/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch06/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch07/Makefile",
    "content": ".PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(&model.User{}) //nolint: errcheck\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"uniqueIndex;type:varchar(128) not null\"`\n\tPassword string `gorm:\"type:varchar(64) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/bytedance/gopkg/cloud/metainfo\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tclientName, ok := metainfo.GetPersistentValue(s.ctx, \"CLIENT_NAME\")\n\tfmt.Println(clientName, ok)\n\tif req.Message == \"error\" {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(1004001, \"client param error\")\n\t}\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/bytedance/gopkg/cloud/metainfo\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/middleware\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithMiddleware(middleware.Middleware),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tctx := metainfo.WithPersistentValue(context.Background(), \"CLIENT_NAME\", \"demo_proto_client\")\n\tres, err := c.Echo(ctx, &pbapi.Request{Message: \"error\"})\n\tvar bizErr *kerrors.GRPCBizStatusError\n\tif err != nil {\n\t\tok := errors.As(err, &bizErr)\n\t\tif ok {\n\t\t\tfmt.Printf(\"%#v\", bizErr)\n\t\t}\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\t// CURD\n\n\t// Create\n\t// mysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"jfiojffjsoij\"})\n\n\t// Update\n\t// mysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").Update(\"password\", \"22222222\")\n\n\t// Read\n\tvar row model.User\n\tmysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").First(&row)\n\n\tfmt.Printf(\"row: %+v\\n\", row)\n\n\t// Delete\n\t// mysql.DB.Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n\n\t// mysql.DB.Unscoped().Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/middleware\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr), server.WithMiddleware(middleware.Middleware))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/cloudwego/kitex/pkg/endpoint\"\n)\n\nfunc Middleware(next endpoint.Endpoint) endpoint.Endpoint {\n\treturn func(ctx context.Context, req, resp interface{}) (err error) {\n\t\tbegin := time.Now()\n\t\terr = next(ctx, req, resp)\n\t\tfmt.Println(time.Since(begin))\n\t\treturn err\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\tinfo := rpcinfo.GetRPCInfo(s.ctx)\n\tfmt.Println(info.From().ServiceName())\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n)\n\nfunc main() {\n\tcli, err := echo.NewClient(\"demo_thrift\", client.WithHostPorts(\"localhost:8888\"),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\t\tServiceName: \"demo_thrift_client\",\n\t\t}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tres, err := cli.Echo(context.Background(), &api.Request{\n\t\tMessage: \"hello\",\n\t})\n\tif err != nil {\n\t\tfmt.Println(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch07/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch07/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n      - MYSQL_DATABASE=demo_proto"
  },
  {
    "path": "gomall/tutorial/ch07/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch07/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch07/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch07/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch07/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch07/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch08/Makefile",
    "content": ".PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl ../../idl/frontend/home.proto\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/home\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req home.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"home.tmpl\", resp)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/home\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *home.Empty) (map[string]any, error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tvar resp = make(map[string]any)\n\titems := []map[string]any{\n\t\t{\"Name\": \"T-shirt-1\", \"Price\": 100, \"Picture\": \"/static/image/t-shirt-1.jpeg\"},\n\t\t{\"Name\": \"T-shirt-2\", \"Price\": 110, \"Picture\": \"/static/image/t-shirt-1.jpeg\"},\n\t\t{\"Name\": \"T-shirt-3\", \"Price\": 120, \"Picture\": \"/static/image/t-shirt-2.jpeg\"},\n\t\t{\"Name\": \"T-shirt-4\", \"Price\": 130, \"Picture\": \"/static/image/notebook.jpeg\"},\n\t\t{\"Name\": \"T-shirt-5\", \"Price\": 140, \"Picture\": \"/static/image/t-shirt-1.jpeg\"},\n\t\t{\"Name\": \"T-shirt-6\", \"Price\": 150, \"Picture\": \"/static/image/t-shirt.jpeg\"},\n\t}\n\tresp[\"Title\"] = \"Hot Sales\"\n\tresp[\"Items\"] = items\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/hertz v0.8.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115\n\tgithub.com/hertz-contrib/logger/logrus v1.0.1\n\tgithub.com/hertz-contrib/pprof v0.1.2\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgoogle.golang.org/protobuf v1.34.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 // indirect\n\tgithub.com/bytedance/sonic v1.8.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.0 // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.0.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/go.sum",
    "content": "github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 h1:PtwsQyQJGxf8iaPptPNaduEIu9BnrNms+pcRdHAxZaM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1 h1:NqAHCaGaTzro0xMmnTCLUyRlbEP6r8MCA1cJUrH3Pu4=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.8.1 h1:3Upzd9o5yNPz6rLx70J5xpo5emosKNkmwW00WgQhf/0=\ngithub.com/cloudwego/hertz v0.8.1/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0 h1:oRrOp58cPCvK2QbMozZNDESvrxQaEHW2dCimmwH1lcU=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115 h1:EvTFSVPZhC2O2i3Krhutdje4sSXSc4nmLTkTttKh/s0=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/logrus v1.0.1 h1:1iFu/L92QlFSDXUn77WJL32dk/5HBzAUziG1OqcNMeE=\ngithub.com/hertz-contrib/logger/logrus v1.0.1/go.mod h1:SqDYLwVq5hTItYqimgZQbFCYPOIGNvBTq0Ip2OQwMcY=\ngithub.com/hertz-contrib/pprof v0.1.2 h1:eC4jpg8ToSi+9YEOPIr3jki8e/ix3aFPtphCgJ36T6Q=\ngithub.com/hertz-contrib/pprof v0.1.2/go.mod h1:OKXw5wCUcy1OVwgQLsoCS9JzfcdjoofP+7Uk4c7P9Po=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=\ngithub.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.34.0 h1:Qo/qEd2RZPCf2nKuorzksSknv0d3ERwp1vFG38gSmH4=\ngoogle.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is generated, with a higher priority than api_version\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the client code is generated\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[37]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12,\n\t0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76,\n\t0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t4,  // 37: api.reserve:extendee -> google.protobuf.MessageOptions\n\t38, // [38:38] is the sub-list for method output_type\n\t38, // [38:38] is the sub-list for method input_type\n\t38, // [38:38] is the sub-list for extension type_name\n\t0,  // [0:38] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 38,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_home_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_home_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_home_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x1a, 0x09, 0x61, 0x70, 0x69,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32,\n\t0x48, 0x0a, 0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39,\n\t0x0a, 0x04, 0x48, 0x6f, 0x6d, 0x65, 0x12, 0x14, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x45, 0x6d, 0x70,\n\t0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a, 0x49, 0x67, 0x69, 0x74,\n\t0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67,\n\t0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c,\n\t0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68,\n\t0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_home_proto_rawDescOnce sync.Once\n\tfile_home_proto_rawDescData = file_home_proto_rawDesc\n)\n\nfunc file_home_proto_rawDescGZIP() []byte {\n\tfile_home_proto_rawDescOnce.Do(func() {\n\t\tfile_home_proto_rawDescData = protoimpl.X.CompressGZIP(file_home_proto_rawDescData)\n\t})\n\treturn file_home_proto_rawDescData\n}\n\nvar file_home_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_home_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.home.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.home.HomeService.Home:input_type -> frontend.home.Empty\n\t0, // 1: frontend.home.HomeService.Home:output_type -> frontend.home.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_home_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t\tMessageInfos:      file_home_proto_msgTypes,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzlogrus \"github.com/hertz-contrib/logger/logrus\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t// init dal\n\t// dal.Init()\n\taddress := conf.GetConf().Hertz.Address\n\th := server.New(server.WithHostPorts(address))\n\n\tregisterMiddleware(h)\n\n\t// add a ping route to test\n\th.GET(\"/ping\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.JSON(consts.StatusOK, utils.H{\"ping\": \"pong\"})\n\t})\n\n\trouter.GeneratedRegister(h)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Static(\"/static\", \"./\")\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\t// log\n\tlogger := hertzlogrus.NewLogger()\n\thlog.SetLogger(logger)\n\thlog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Hertz.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Hertz.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Hertz.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Hertz.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\thlog.SetOutput(asyncWriter)\n\th.OnShutdown = append(h.OnShutdown, func(ctx context.Context) {\n\t\tasyncWriter.Sync()\n\t})\n\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\t// cores\n\th.Use(cors.Default())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/template/footer.tmpl",
    "content": "{{define \"footer\"}}\n</div>\n</main>\n  <footer>\n    <div class=\"text-bg-primary py-5 text-center\">\n      <p>&copy; 2024 <a href=\"https://github.com/cloudwego\" class=\"text-reset\">CloudWeGo</a></p>\n    </div>\n  </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\" integrity=\"sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz\" crossorigin=\"anonymous\"></script>\n  </body>\n</html>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/template/header.tmpl",
    "content": "{{define \"header\"}}\n<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>{{$.Title}} | CloudWeGo Shop</title>\n    <link href=\"/static/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n            integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n</head>\n<body>\n<header>\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n        <img class=\"navbar-brand\" href=\"#\" src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" style=\"height: 3em;\"/>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n        </button>\n        <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n            <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Categories\n            </a>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">T-shirt</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Sticker</a></li>\n            </ul>\n            </li>\n            <li class=\"nav-item\">\n            <a class=\"nav-link\">About</a>\n            </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n            <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n\n        <div class=\"ms-3\">\n            <i class=\"fa-solid fa-cart-shopping fa-xl\"></i>\n        </div>\n\n        <div class=\"ms-3\">\n            <i class=\"fa-solid fa-user fa-xl\"></i>\n        </div>\n\n        <div class=\"ms-3\">\n        <button type=\"button\" class=\"btn btn-primary\">Sign In</button>\n        </div>\n\n        </div>\n    </div>\n    </nav>\n</header>\n<main>\n<div class=\"container-fluid\">\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch08/app/frontend/template/home.tmpl",
    "content": "{{template \"header\" .}}\n    <div class=\"row\">\n      {{range .Items}}\n      <div class=\"card col-xl-3 col-lg-4 col-md-6 col-sm-12 p-5 border-0\" >\n        <img src=\"{{.Picture}}\" class=\"card-img-top\" alt=\"...\">\n        <div class=\"card-body\">\n          <p class=\"card-text\">{{ .Name}}</p>\n          <h5 class=\"card-title\">{{ .Price}}</h5>\n        </div>\n      </div>\n      {{end}}\n    </div>\n{{template \"footer\"}}"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(&model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"uniqueIndex;type:varchar(128) not null\"`\n\tPassword string `gorm:\"type:varchar(64) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\t// CURD\n\n\t// Create\n\t// mysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"jfiojffjsoij\"})\n\n\t// Update\n\t// mysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").Update(\"password\", \"22222222\")\n\n\t// Read\n\tvar row model.User\n\tmysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").First(&row)\n\n\tfmt.Printf(\"row: %+v\\n\", row)\n\n\t// Delete\n\t// mysql.DB.Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n\n\t// mysql.DB.Unscoped().Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.16.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.10.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/goleak v1.2.1 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=\ngithub.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=\ngo.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.16.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.10.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/goleak v1.2.1 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=\ngithub.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=\ngo.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch08/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch08/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n      - MYSQL_DATABASE=demo_proto"
  },
  {
    "path": "gomall/tutorial/ch08/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/frontend\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch08/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch08/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch08/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n    optional string raw_body = 50101;\n    optional string query = 50102;\n    optional string header = 50103;\n    optional string cookie = 50104;\n    optional string body = 50105;\n    optional string path = 50106;\n    optional string vd = 50107;\n    optional string form = 50108;\n    optional string js_conv = 50109;\n    optional string file_name = 50110;\n    optional string none = 50111;\n\n    // 50131~50160 used to extend field option by hz\n    optional string form_compatible = 50131;\n    optional string js_conv_compatible = 50132;\n    optional string file_name_compatible = 50133;\n    optional string none_compatible = 50134;\n    // 50135 is reserved to vt_compatible\n    // optional FieldRules vt_compatible = 50135;\n\n    optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n    optional string get = 50201;\n    optional string post = 50202;\n    optional string put = 50203;\n    optional string delete = 50204;\n    optional string patch = 50205;\n    optional string options = 50206;\n    optional string head = 50207;\n    optional string any = 50208;\n    optional string gen_path = 50301; // The path specified by the user when the client code is generated, with a higher priority than api_version\n    optional string api_version = 50302; // Specify the value of the :version variable in path when the client code is generated\n    optional string tag = 50303; // rpc tag, can be multiple, separated by commas\n    optional string name = 50304; // Name of rpc\n    optional string api_level = 50305; // Interface Level\n    optional string serializer = 50306; // Serialization method\n    optional string param = 50307; // Whether client requests take public parameters\n    optional string baseurl = 50308; // Baseurl used in ttnet routing\n    optional string handler_path = 50309; // handler_path specifies the path to generate the method\n\n    // 50331~50360 used to extend method option by hz\n    optional string handler_path_compatible = 50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n    optional int32 http_code = 50401;\n\n// 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n    optional string base_domain = 50402;\n\n    // 50731~50760 used to extend service option by hz\n    optional string base_domain_compatible = 50731;\n}\n\nextend google.protobuf.MessageOptions {\n    // optional FieldRules msg_vt = 50111;\n\n    optional string reserve = 50830;\n    // 550831 is reserved to msg_vt_compatible\n    // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch08/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch08/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch08/idl/frontend/home.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.home;\n\nimport \"api.proto\";\n\noption go_package = \"frontend/home\";\n\nmessage Empty {}\n\nservice HomeService {\n   rpc Home(Empty) returns(Empty) {\n      option (api.get) = \"/\";\n   }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/.gitignore",
    "content": "app/*/tmp\napp/*/.env"
  },
  {
    "path": "gomall/tutorial/ch09/Makefile",
    "content": "export ROOT_MOD=github.com/cloudwego/biz-demo/gomall\n.PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module ${ROOT_MOD}/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module  ${ROOT_MOD}/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module  ${ROOT_MOD}/app/frontend --idl ../../idl/frontend/auth_page.proto\n\n.PHONY: gen-user\ngen-user:\n\t@cd app/user && cwgo server --type RPC  --service user --module  ${ROOT_MOD}/app/user  --pass \"-use  ${ROOT_MOD}/rpc_gen/kitex_gen\" -I ../../idl  --idl ../../idl/user.proto\n\t@cd rpc_gen && cwgo client --type RPC  --service user --module  ${ROOT_MOD}/rpc_gen --I ../idl --idl ../idl/user.proto"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(redirect))\n}\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\tauth.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (map[string]any, error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tvar resp = make(map[string]any)\n\titems := []map[string]any{\n\t\t{\"Name\": \"T-shirt-1\", \"Price\": 100, \"Picture\": \"/static/image/t-shirt-1.jpeg\"},\n\t\t{\"Name\": \"T-shirt-2\", \"Price\": 110, \"Picture\": \"/static/image/t-shirt-1.jpeg\"},\n\t\t{\"Name\": \"T-shirt-3\", \"Price\": 120, \"Picture\": \"/static/image/t-shirt-2.jpeg\"},\n\t\t{\"Name\": \"T-shirt-4\", \"Price\": 130, \"Picture\": \"/static/image/notebook.jpeg\"},\n\t\t{\"Name\": \"T-shirt-5\", \"Price\": 140, \"Picture\": \"/static/image/t-shirt-1.jpeg\"},\n\t\t{\"Name\": \"T-shirt-6\", \"Price\": 150, \"Picture\": \"/static/image/t-shirt.jpeg\"},\n\t}\n\tresp[\"title\"] = \"Hot Sales\"\n\tresp[\"items\"] = items\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (redirect string, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tresp, err := rpc.UserClient.Login(h.Context, &user.LoginReq{\n\t\tEmail:    req.Email,\n\t\tPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", resp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tredirect = \"/\"\n\tif req.Next != \"\" {\n\t\tredirect = req.Next\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tuserResp, err := rpc.UserClient.Register(h.Context, &user.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tPasswordConfirm: req.PasswordConfirm,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", userResp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tcontent[\"user_id\"] = frontendUtils.GetUserIdFromCtx(ctx)\n\treturn content\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.8.1\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115\n\tgithub.com/hertz-contrib/logger/logrus v1.0.1\n\tgithub.com/hertz-contrib/pprof v0.1.2\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.2.0\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.3 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.8.1 h1:3Upzd9o5yNPz6rLx70J5xpo5emosKNkmwW00WgQhf/0=\ngithub.com/cloudwego/hertz v0.8.1/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=\ngithub.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115 h1:EvTFSVPZhC2O2i3Krhutdje4sSXSc4nmLTkTttKh/s0=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/logrus v1.0.1 h1:1iFu/L92QlFSDXUn77WJL32dk/5HBzAUziG1OqcNMeE=\ngithub.com/hertz-contrib/logger/logrus v1.0.1/go.mod h1:SqDYLwVq5hTItYqimgZQbFCYPOIGNvBTq0Ip2OQwMcY=\ngithub.com/hertz-contrib/pprof v0.1.2 h1:eC4jpg8ToSi+9YEOPIr3jki8e/ix3aFPtphCgJ36T6Q=\ngithub.com/hertz-contrib/pprof v0.1.2/go.mod h1:OKXw5wCUcy1OVwgQLsoCS9JzfcdjoofP+7Uk4c7P9Po=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.2.0 h1:1xTBMqCwN7uaLIlAwTCAPMO42exnPoJDFrM+hQOiNy4=\ngithub.com/kitex-contrib/registry-consul v0.2.0/go.mod h1:9iBT1P7g/G0ipv+HQDaVpV7jcrXbUABDhKkIbdgvheM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=\ngithub.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is generated, with a higher priority than api_version\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the client code is generated\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[37]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12,\n\t0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76,\n\t0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t4,  // 37: api.reserve:extendee -> google.protobuf.MessageOptions\n\t38, // [38:38] is the sub-list for method output_type\n\t38, // [38:38] is the sub-list for method input_type\n\t38, // [38:38] is the sub-list for extension type_name\n\t0,  // [0:38] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 38,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\" form:\"password_confirm\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x73, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2,\n\t0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52,\n\t0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69,\n\t0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69,\n\t0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73,\n\t0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x12, 0x3f, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb,\n\t0x18, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,\n\t0x72, 0x6d, 0x52, 0x0f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x72, 0x6d, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x17, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x4c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0f, 0xd2,\n\t0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x52,\n\t0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,\n\t0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x12,\n\t0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,\n\t0x65, 0x72, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x4b,\n\t0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*LoginReq)(nil),     // 0: frontend.auth.LoginReq\n\t(*RegisterReq)(nil),  // 1: frontend.auth.RegisterReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t1, // 1: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x1a, 0x09, 0x61, 0x70, 0x69,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x4c, 0x0a,\n\t0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x04,\n\t0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a, 0x49, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.home.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.home.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tUserClient userservice.Client\n\n\tonce sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitUserClient()\n\t})\n}\n\nfunc initUserClient() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendUtils.MustHandleError(err)\n\tUserClient, err = userservice.NewClient(\"user\", client.WithResolver(r))\n\tfrontendUtils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/infra/rpc/client_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\nfunc Test_iniUserClient(t *testing.T) {\n\tinitUserClient()\n\tresp, err := UserClient.Login(context.Background(), &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"jfoajsfoji\",\n\t})\n\tif err != nil {\n\t\tt.Errorf(\"err: %v\", err)\n\t\treturn\n\t}\n\tt.Logf(\"resp: %v\", resp)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzlogrus \"github.com/hertz-contrib/logger/logrus\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\t// init dal\n\t// dal.Init()\n\trpc.InitClient()\n\taddress := conf.GetConf().Hertz.Address\n\th := server.New(server.WithHostPorts(address))\n\n\tregisterMiddleware(h)\n\n\t// add a ping route to test\n\th.GET(\"/ping\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.JSON(consts.StatusOK, utils.H{\"ping\": \"pong\"})\n\t})\n\n\trouter.GeneratedRegister(h)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Static(\"/static\", \"./\")\n\n\th.GET(\"/about\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"about\", utils.H{\"title\": \"About\"})\n\t})\n\n\th.GET(\"/sign-in\", func(c context.Context, ctx *app.RequestContext) {\n\t\tdata := utils.H{\n\t\t\t\"title\": \"Sign In\",\n\t\t\t\"next\":  ctx.Query(\"next\"),\n\t\t}\n\t\tctx.HTML(consts.StatusOK, \"sign-in\", data)\n\t})\n\th.GET(\"/sign-up\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"sign-up\", utils.H{\"title\": \"Sign Up\"})\n\t})\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\tstore, err := redis.NewStore(10, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\n\t// log\n\tlogger := hertzlogrus.NewLogger()\n\thlog.SetLogger(logger)\n\thlog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Hertz.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Hertz.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Hertz.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Hertz.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\thlog.SetOutput(asyncWriter)\n\th.OnShutdown = append(h.OnShutdown, func(ctx context.Context) {\n\t\tasyncWriter.Sync()\n\t})\n\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\t// cores\n\th.Use(cors.Default())\n\n\tmiddleware.Register(h)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tctx = context.WithValue(ctx, frontendUtils.SessionUserId, s.Get(\"user_id\"))\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tuserId := s.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Redirect(consts.StatusFound, []byte(\"/sign-in?next=\"+c.FullPath()))\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc Register(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/template/about.tmpl",
    "content": "{{define \"about\"}}\n{{template \"header\" .}}\n  <div>\n    <img src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" class=\"col-lg-2 col-md-3 col-sm-4\"/>\n    <p>This is community a driven project.</p>\n  </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/template/footer.tmpl",
    "content": "{{define \"footer\"}}\n</div>\n</main>\n  <footer>\n    <div class=\"text-bg-primary py-5 text-center\">\n      <p>&copy; 2024 <a href=\"https://github.com/cloudwego\" class=\"text-reset\">CloudWeGo</a></p>\n    </div>\n  </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\" integrity=\"sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz\" crossorigin=\"anonymous\"></script>\n  </body>\n</html>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/template/header.tmpl",
    "content": "{{define \"header\"}}\n<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>CloudWeGo Shop</title>\n    <link href=\"/static/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n            integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n</head>\n<body class=\"min-vh-100\">\n<header>\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container\">\n        <img class=\"navbar-brand\" href=\"#\" src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" style=\"height: 3em;\"/>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n        </button>\n        <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n            <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"/\">CloudWeGo Shop</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Categories\n            </a>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">T-shirt</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Sticker</a></li>\n            </ul>\n            </li>\n            <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"/about\" >About</a>\n            </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n            <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n\n        <div class=\"ms-3\">\n            <i class=\"fa-solid fa-cart-shopping fa-xl\"></i>\n        </div>\n\n        {{ if .user_id }}\n        <div class=\"dropdown\">\n            <div class=\"ms-3 dropdown-toggle\" data-bs-toggle=\"dropdown\">\n                <i class=\"fa-solid fa-user fa-lg\"></i>\n                <span>Hello</span>\n            </div>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Order Center</a></li>\n                <li>\n                    <form action=\"/auth/logout\" method=\"post\">\n                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                    </form>\n                </li>\n            </ul>\n        </div>\n        {{ else }}\n        <div class=\"ms-3\">\n        <a type=\"button\" class=\"btn btn-primary\" href=\"/sign-in\">Sign In</a>\n        </div>\n        {{ end }}\n        </div>\n    </div>\n    </nav>\n    <div class=\"text-bg-primary text-center\">\n    <p>This Website is hosted for demo purposes only.It is not an actual shop</p>\n    </div>\n</header>\n<main style=\"min-height: calc(80vh);\">\n<div class=\"container-fluid py-3\">\n<h1 class=\"text-center\">{{$.title}}</h1>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/template/home.tmpl",
    "content": "{{define \"home\"}}\n{{template \"header\" .}}\n    <div class=\"row\">\n      {{range .items}}\n      <div class=\"card col-xl-3 col-lg-4 col-md-6 col-sm-12 p-5 border-0\" >\n        <img src=\"{{.Picture}}\" class=\"card-img-top\" alt=\"...\">\n        <div class=\"card-body\">\n          <p class=\"card-text\">{{ .Name}}</p>\n          <h5 class=\"card-title\">{{ .Price}}</h5>\n        </div>\n      </div>\n      {{end}}\n    </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/template/required.tmpl",
    "content": "{{ define \"required\" }}\n<span class=\"text-danger\">*</span>\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/template/sign-in.tmpl",
    "content": "{{define \"sign-in\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/login?next={{ .next }}\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign Up</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign In</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/template/sign-up.tmpl",
    "content": "{{define \"sign-up\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password_confirm\" class=\"form-label\">Password Confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password_confirm\" name=\"password_confirm\">\n              </div>\n            <div class=\"mb-3\">\n                Already have a account, click here to <a href=\"/sign-in\">Sign In</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign Up</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\ntype SessionUserIdKey string\n\nconst SessionUserId SessionUserIdKey = \"user_id\"\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) int32 {\n\tuserId := ctx.Value(SessionUserId)\n\tif userId == nil {\n\t\treturn 0\n\t}\n\treturn userId.(int32)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif conf.GetConf().Env != \"online\" {\n\t\terr = DB.AutoMigrate(&model.User{})\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tgorm.Model\n\tEmail          string `gorm:\"uniqueIndex;type:varchar(255) not null\"`\n\tPasswordHashed string `gorm:\"type:varchar(255) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n\nfunc Create(ctx context.Context, db *gorm.DB, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n\nfunc GetByEmail(ctx context.Context, db *gorm.DB, email string) (*User, error) {\n\tvar user User\n\terr := db.WithContext(ctx).Where(\"email = ?\", email).First(&user).Error\n\treturn &user, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\trow, err := model.GetByEmail(s.ctx, mysql.DB, req.Email)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(row.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &user.LoginResp{\n\t\tUserId: int32(row.ID),\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewLoginService(ctx)\n\t// init req and assert value\n\n\treq := &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" || req.PasswordConfirm == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\tif req.Password != req.PasswordConfirm {\n\t\treturn nil, errors.New(\"password not match\")\n\t}\n\tpasswordHashed, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(passwordHashed),\n\t}\n\terr = model.Create(s.ctx, mysql.DB, newUser)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewRegisterService(ctx)\n\t// init req and assert value\n\n\treq := &user.RegisterReq{\n\t\tEmail:           \"1demo@damin.com\",\n\t\tPassword:        \"FJODIAFUFJO\",\n\t\tPasswordConfirm: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch09/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/tutorial/ch09/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/tutorial/ch09/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(&model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"uniqueIndex;type:varchar(128) not null\"`\n\tPassword string `gorm:\"type:varchar(64) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\t// CURD\n\n\t// Create\n\t// mysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"jfiojffjsoij\"})\n\n\t// Update\n\t// mysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").Update(\"password\", \"22222222\")\n\n\t// Read\n\tvar row model.User\n\tmysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").First(&row)\n\n\tfmt.Printf(\"row: %+v\\n\", row)\n\n\t// Delete\n\t// mysql.DB.Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n\n\t// mysql.DB.Unscoped().Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.16.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.10.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/goleak v1.2.1 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=\ngithub.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=\ngo.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.16.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.10.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/goleak v1.2.1 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=\ngithub.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=\ngo.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch09/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch09/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n      - MYSQL_DATABASE=demo_proto\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: \"redis:latest\"\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch09/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/frontend\n\t./app/user\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch09/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch09/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch09/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n    optional string raw_body = 50101;\n    optional string query = 50102;\n    optional string header = 50103;\n    optional string cookie = 50104;\n    optional string body = 50105;\n    optional string path = 50106;\n    optional string vd = 50107;\n    optional string form = 50108;\n    optional string js_conv = 50109;\n    optional string file_name = 50110;\n    optional string none = 50111;\n\n    // 50131~50160 used to extend field option by hz\n    optional string form_compatible = 50131;\n    optional string js_conv_compatible = 50132;\n    optional string file_name_compatible = 50133;\n    optional string none_compatible = 50134;\n    // 50135 is reserved to vt_compatible\n    // optional FieldRules vt_compatible = 50135;\n\n    optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n    optional string get = 50201;\n    optional string post = 50202;\n    optional string put = 50203;\n    optional string delete = 50204;\n    optional string patch = 50205;\n    optional string options = 50206;\n    optional string head = 50207;\n    optional string any = 50208;\n    optional string gen_path = 50301; // The path specified by the user when the client code is generated, with a higher priority than api_version\n    optional string api_version = 50302; // Specify the value of the :version variable in path when the client code is generated\n    optional string tag = 50303; // rpc tag, can be multiple, separated by commas\n    optional string name = 50304; // Name of rpc\n    optional string api_level = 50305; // Interface Level\n    optional string serializer = 50306; // Serialization method\n    optional string param = 50307; // Whether client requests take public parameters\n    optional string baseurl = 50308; // Baseurl used in ttnet routing\n    optional string handler_path = 50309; // handler_path specifies the path to generate the method\n\n    // 50331~50360 used to extend method option by hz\n    optional string handler_path_compatible = 50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n    optional int32 http_code = 50401;\n\n// 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n    optional string base_domain = 50402;\n\n    // 50731~50760 used to extend service option by hz\n    optional string base_domain_compatible = 50731;\n}\n\nextend google.protobuf.MessageOptions {\n    // optional FieldRules msg_vt = 50111;\n\n    optional string reserve = 50830;\n    // 550831 is reserved to msg_vt_compatible\n    // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch09/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch09/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/auth\";\n\nmessage LoginReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string next = 3 [(api.query)=\"next\"];\n}\n\nmessage RegisterReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string password_confirm = 3 [(api.form)=\"password_confirm\"];\n}\n\nservice AuthService {\n   rpc login(LoginReq) returns(common.Empty) {\n      option (api.post) = \"/auth/login\";\n   }\n   rpc register(RegisterReq) returns(common.Empty) {\n    option (api.post) = \"/auth/register\";\n }\n rpc logout(common.Empty) returns(common.Empty) {\n    option (api.post) = \"/auth/logout\";\n }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\n\nmessage Empty {}"
  },
  {
    "path": "gomall/tutorial/ch09/idl/frontend/home.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.home;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/home\";\n\nservice HomeService {\n   rpc Home(common.Empty) returns(common.Empty) {\n      option (api.get) = \"/\";\n   }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/idl/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"/user\";\n\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string password_confirm = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email = 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n\nservice UserService {\n  rpc Register (RegisterReq) returns (RegisterResp) {}\n  rpc Login (LoginReq) returns (LoginResp) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.5\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgoogle.golang.org/protobuf v1.36.6\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.PasswordConfirm, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetPasswordConfirm())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetPasswordConfirm())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"PasswordConfirm\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Register\": kitex.NewMethodInfo(registerHandler, newRegisterArgs, newRegisterResult, false),\n\t\t\"Login\":    kitex.NewMethodInfo(loginHandler, newLoginArgs, newLoginResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"user\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch09/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/.gitignore",
    "content": "app/*/tmp\napp/*/.env"
  },
  {
    "path": "gomall/tutorial/ch10/Makefile",
    "content": "export ROOT_MOD=github.com/cloudwego/biz-demo/gomall\n.PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module ${ROOT_MOD}/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module  ${ROOT_MOD}/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module  ${ROOT_MOD}/app/frontend --idl ../../idl/frontend/category_page.proto\n\n.PHONY: gen-user\ngen-user: \n\t@cd rpc_gen && cwgo client --type RPC --service user --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/user.proto\n\t@cd app/user && cwgo server --type RPC --service user --module ${ROOT_MOD}/app/user --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/user.proto\n\n.PHONY: gen-product\ngen-product: \n\t@cd rpc_gen && cwgo client --type RPC --service product --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/product.proto\n\t@cd app/product && cwgo server --type RPC --service product --module ${ROOT_MOD}/app/product --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/product.proto\n\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(redirect))\n}\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/handler/category/category_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Category .\n// @router /category/:category [GET]\nfunc Category(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req category.CategoryReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewCategoryService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"category\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/handler/category/category_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCategory(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/category/:category\", Category)\n\tpath := \"/category/:category\"                             // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/handler/product/product_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetProduct .\n// @router /product [GET]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.ProductReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetProductService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"product\", resp)\n}\n\n// SearchProducts .\n// @router /search [GET]\nfunc SearchProducts(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.SearchProductsReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewSearchProductsService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"search\", resp)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/handler/product/product_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetProduct(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/product\", GetProduct)\n\tpath := \"/product\"                                        // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestSearchProducts(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/search\", SearchProducts)\n\tpath := \"/search\"                                         // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/router/category/category_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage category\n\nimport (\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/category\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_category := root.Group(\"/category\", _categoryMw()...)\n\t\t_category.GET(\"/:category\", append(_category0Mw(), category.Category)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/router/category/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage category\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _categoryMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _category0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/router/product/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage product\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getproductMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _searchproductsMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/router/product/product_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage product\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/product\", append(_getproductMw(), product.GetProduct)...)\n\troot.GET(\"/search\", append(_searchproductsMw(), product.SearchProducts)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/category\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\tcategory.Register(r)\n\n\tproduct.Register(r)\n\n\tauth.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/service/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CategoryService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCategoryService(Context context.Context, RequestContext *app.RequestContext) *CategoryService {\n\treturn &CategoryService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CategoryService) Run(req *category.CategoryReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{CategoryName: req.Category})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"title\": \"Category\",\n\t\t\"items\": p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetProductService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetProductService(Context context.Context, RequestContext *app.RequestContext) *GetProductService {\n\treturn &GetProductService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetProductService) Run(req *product.ProductReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: req.Id})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"item\": p.Product,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (res map[string]any, err error) {\n\tproducts, err := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Hot sale\",\n\t\t\"items\": products.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (redirect string, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tresp, err := rpc.UserClient.Login(h.Context, &user.LoginReq{\n\t\tEmail:    req.Email,\n\t\tPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", resp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tredirect = \"/\"\n\tif req.Next != \"\" {\n\t\tredirect = req.Next\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tuserResp, err := rpc.UserClient.Register(h.Context, &user.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tPasswordConfirm: req.PasswordConfirm,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", userResp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype SearchProductsService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewSearchProductsService(Context context.Context, RequestContext *app.RequestContext) *SearchProductsService {\n\treturn &SearchProductsService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *SearchProductsService) Run(req *product.SearchProductsReq) (resp map[string]any, err error) {\n\tproducts, err := rpc.ProductClient.SearchProducts(h.Context, &rpcproduct.SearchProductsReq{\n\t\tQuery: req.Q,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"items\": products.Results,\n\t\t\"q\":     req.Q,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tcontent[\"user_id\"] = frontendUtils.GetUserIdFromCtx(ctx)\n\treturn content\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.8.1\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115\n\tgithub.com/hertz-contrib/logger/logrus v1.0.1\n\tgithub.com/hertz-contrib/pprof v0.1.2\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.2.0\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.3 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.8.1 h1:3Upzd9o5yNPz6rLx70J5xpo5emosKNkmwW00WgQhf/0=\ngithub.com/cloudwego/hertz v0.8.1/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=\ngithub.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115 h1:EvTFSVPZhC2O2i3Krhutdje4sSXSc4nmLTkTttKh/s0=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/logrus v1.0.1 h1:1iFu/L92QlFSDXUn77WJL32dk/5HBzAUziG1OqcNMeE=\ngithub.com/hertz-contrib/logger/logrus v1.0.1/go.mod h1:SqDYLwVq5hTItYqimgZQbFCYPOIGNvBTq0Ip2OQwMcY=\ngithub.com/hertz-contrib/pprof v0.1.2 h1:eC4jpg8ToSi+9YEOPIr3jki8e/ix3aFPtphCgJ36T6Q=\ngithub.com/hertz-contrib/pprof v0.1.2/go.mod h1:OKXw5wCUcy1OVwgQLsoCS9JzfcdjoofP+7Uk4c7P9Po=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.2.0 h1:1xTBMqCwN7uaLIlAwTCAPMO42exnPoJDFrM+hQOiNy4=\ngithub.com/kitex-contrib/registry-consul v0.2.0/go.mod h1:9iBT1P7g/G0ipv+HQDaVpV7jcrXbUABDhKkIbdgvheM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=\ngithub.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50732,\n\t\tName:          \"api.service_path\",\n\t\tTag:           \"bytes,50732,opt,name=service_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is\n\t// generated, with a higher priority than api_version\n\t//\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the\n\t// client code is generated\n\t//\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n\t// optional string service_path = 50732;\n\tE_ServicePath = &file_api_proto_extTypes[37]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[38]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x47, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xac, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a,\n\t0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t3,  // 37: api.service_path:extendee -> google.protobuf.ServiceOptions\n\t4,  // 38: api.reserve:extendee -> google.protobuf.MessageOptions\n\t39, // [39:39] is the sub-list for method output_type\n\t39, // [39:39] is the sub-list for method input_type\n\t39, // [39:39] is the sub-list for extension type_name\n\t0,  // [0:39] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 39,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\" form:\"password_confirm\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x73, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2,\n\t0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52,\n\t0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69,\n\t0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69,\n\t0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73,\n\t0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x12, 0x3f, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb,\n\t0x18, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,\n\t0x72, 0x6d, 0x52, 0x0f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x72, 0x6d, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x17, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x4c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0f, 0xd2,\n\t0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x52,\n\t0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,\n\t0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x12,\n\t0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,\n\t0x65, 0x72, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x4b,\n\t0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*LoginReq)(nil),     // 0: frontend.auth.LoginReq\n\t(*RegisterReq)(nil),  // 1: frontend.auth.RegisterReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t1, // 1: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/hertz_gen/frontend/category/category_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: category_page.proto\n\npackage category\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CategoryReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory string `protobuf:\"bytes,1,opt,name=category,proto3\" json:\"category,omitempty\" path:\"category\"`\n}\n\nfunc (x *CategoryReq) Reset() {\n\t*x = CategoryReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_category_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryReq) ProtoMessage() {}\n\nfunc (x *CategoryReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_category_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryReq.ProtoReflect.Descriptor instead.\nfunc (*CategoryReq) Descriptor() ([]byte, []int) {\n\treturn file_category_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CategoryReq) GetCategory() string {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn \"\"\n}\n\nvar File_category_page_proto protoreflect.FileDescriptor\n\nvar file_category_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x08, 0x63, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xd2, 0xbb, 0x18,\n\t0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x32, 0x6e, 0x0a, 0x0f, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13,\n\t0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2f, 0x3a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x42, 0x4f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d,\n\t0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_category_page_proto_rawDescOnce sync.Once\n\tfile_category_page_proto_rawDescData = file_category_page_proto_rawDesc\n)\n\nfunc file_category_page_proto_rawDescGZIP() []byte {\n\tfile_category_page_proto_rawDescOnce.Do(func() {\n\t\tfile_category_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_category_page_proto_rawDescData)\n\t})\n\treturn file_category_page_proto_rawDescData\n}\n\nvar file_category_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_category_page_proto_goTypes = []interface{}{\n\t(*CategoryReq)(nil),  // 0: frontend.category.CategoryReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_category_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.category.CategoryService.Category:input_type -> frontend.category.CategoryReq\n\t1, // 1: frontend.category.CategoryService.Category:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_category_page_proto_init() }\nfunc file_category_page_proto_init() {\n\tif File_category_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_category_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_category_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_category_page_proto_goTypes,\n\t\tDependencyIndexes: file_category_page_proto_depIdxs,\n\t\tMessageInfos:      file_category_page_proto_msgTypes,\n\t}.Build()\n\tFile_category_page_proto = out.File\n\tfile_category_page_proto_rawDesc = nil\n\tfile_category_page_proto_goTypes = nil\n\tfile_category_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x1a, 0x09, 0x61, 0x70, 0x69,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x4c, 0x0a,\n\t0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x04,\n\t0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a, 0x49, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.home.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.home.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/hertz_gen/frontend/product/product_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: product_page.proto\n\npackage product\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\" query:\"id\"`\n}\n\nfunc (x *ProductReq) Reset() {\n\t*x = ProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProductReq) ProtoMessage() {}\n\nfunc (x *ProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProductReq.ProtoReflect.Descriptor instead.\nfunc (*ProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQ string `protobuf:\"bytes,1,opt,name=q,proto3\" json:\"q,omitempty\" query:\"q\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *SearchProductsReq) GetQ() string {\n\tif x != nil {\n\t\treturn x.Q\n\t}\n\treturn \"\"\n}\n\nvar File_product_page_proto protoreflect.FileDescriptor\n\nvar file_product_page_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,\n\t0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x42, 0x06, 0xb2, 0xbb, 0x18, 0x02, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x22, 0x28,\n\t0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x12, 0x13, 0x0a, 0x01, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05,\n\t0xb2, 0xbb, 0x18, 0x01, 0x71, 0x52, 0x01, 0x71, 0x32, 0xbe, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x47,\n\t0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x0c, 0xca, 0xc1, 0x18, 0x08, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x5a, 0x0a,\n\t0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12,\n\t0x23, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0b, 0xca, 0xc1,\n\t0x18, 0x07, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74,\n\t0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67,\n\t0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c,\n\t0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68,\n\t0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_product_page_proto_rawDescOnce sync.Once\n\tfile_product_page_proto_rawDescData = file_product_page_proto_rawDesc\n)\n\nfunc file_product_page_proto_rawDescGZIP() []byte {\n\tfile_product_page_proto_rawDescOnce.Do(func() {\n\t\tfile_product_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_page_proto_rawDescData)\n\t})\n\treturn file_product_page_proto_rawDescData\n}\n\nvar file_product_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_product_page_proto_goTypes = []interface{}{\n\t(*ProductReq)(nil),        // 0: frontend.product.ProductReq\n\t(*SearchProductsReq)(nil), // 1: frontend.product.SearchProductsReq\n\t(*common.Empty)(nil),      // 2: frontend.common.Empty\n}\nvar file_product_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.product.ProductService.GetProduct:input_type -> frontend.product.ProductReq\n\t1, // 1: frontend.product.ProductService.SearchProducts:input_type -> frontend.product.SearchProductsReq\n\t2, // 2: frontend.product.ProductService.GetProduct:output_type -> frontend.common.Empty\n\t2, // 3: frontend.product.ProductService.SearchProducts:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_product_page_proto_init() }\nfunc file_product_page_proto_init() {\n\tif File_product_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_page_proto_goTypes,\n\t\tDependencyIndexes: file_product_page_proto_depIdxs,\n\t\tMessageInfos:      file_product_page_proto_msgTypes,\n\t}.Build()\n\tFile_product_page_proto = out.File\n\tfile_product_page_proto_rawDesc = nil\n\tfile_product_page_proto_goTypes = nil\n\tfile_product_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tUserClient    userservice.Client\n\tProductClient productcatalogservice.Client\n\tonce          sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitUserClient()\n\t\tinitProductClient()\n\t})\n}\n\nfunc initUserClient() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\tUserClient, err = userservice.NewClient(\"user\", client.WithResolver(r))\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/infra/rpc/client_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\nfunc Test_iniUserClient(t *testing.T) {\n\tinitUserClient()\n\tresp, err := UserClient.Login(context.Background(), &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"jfoajsfoji\",\n\t})\n\tif err != nil {\n\t\tt.Errorf(\"err: %v\", err)\n\t\treturn\n\t}\n\tt.Logf(\"resp: %v\", resp)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzlogrus \"github.com/hertz-contrib/logger/logrus\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\t// init dal\n\t// dal.Init()\n\trpc.InitClient()\n\taddress := conf.GetConf().Hertz.Address\n\th := server.New(server.WithHostPorts(address))\n\n\tregisterMiddleware(h)\n\n\t// add a ping route to test\n\th.GET(\"/ping\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.JSON(consts.StatusOK, utils.H{\"ping\": \"pong\"})\n\t})\n\n\trouter.GeneratedRegister(h)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Static(\"/static\", \"./\")\n\n\th.GET(\"/about\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"about\", utils.H{\"title\": \"About\"})\n\t})\n\n\th.GET(\"/sign-in\", func(c context.Context, ctx *app.RequestContext) {\n\t\tdata := utils.H{\n\t\t\t\"title\": \"Sign In\",\n\t\t\t\"next\":  ctx.Query(\"next\"),\n\t\t}\n\t\tctx.HTML(consts.StatusOK, \"sign-in\", data)\n\t})\n\th.GET(\"/sign-up\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"sign-up\", utils.H{\"title\": \"Sign Up\"})\n\t})\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\tstore, err := redis.NewStore(10, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\n\t// log\n\tlogger := hertzlogrus.NewLogger()\n\thlog.SetLogger(logger)\n\thlog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Hertz.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Hertz.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Hertz.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Hertz.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\thlog.SetOutput(asyncWriter)\n\th.OnShutdown = append(h.OnShutdown, func(ctx context.Context) {\n\t\tasyncWriter.Sync()\n\t})\n\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\t// cores\n\th.Use(cors.Default())\n\n\tmiddleware.Register(h)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tctx = context.WithValue(ctx, frontendUtils.SessionUserId, s.Get(\"user_id\"))\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tuserId := s.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Redirect(302, []byte(\"/sign-in?next=\"+c.FullPath()))\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc Register(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/about.tmpl",
    "content": "{{define \"about\"}}\n{{template \"header\" .}}\n  <div>\n    <img src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" class=\"col-lg-2 col-md-3 col-sm-4\"/>\n    <p>This is community a driven project.</p>\n  </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/category.tmpl",
    "content": "{{ define \"category\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/footer.tmpl",
    "content": "{{define \"footer\"}}\n</div>\n</main>\n  <footer>\n    <div class=\"text-bg-primary py-5 text-center\">\n      <p>&copy; 2024 <a href=\"https://github.com/cloudwego\" class=\"text-reset\">CloudWeGo</a></p>\n    </div>\n  </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\" integrity=\"sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz\" crossorigin=\"anonymous\"></script>\n  </body>\n</html>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/header.tmpl",
    "content": "{{define \"header\"}}\n<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>CloudWeGo Shop</title>\n    <link href=\"/static/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n            integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n</head>\n<body class=\"min-vh-100\">\n<header>\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container\">\n        <img class=\"navbar-brand\" href=\"#\" src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" style=\"height: 3em;\"/>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n        </button>\n        <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n            <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"/\">CloudWeGo Shop</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Categories\n            </a>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"/category/t-shirt\">T-shirt</a></li>\n                <li><a class=\"dropdown-item\" href=\"/category/sticker\">Sticker</a></li>\n            </ul>\n            </li>\n            <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"/about\" >About</a>\n            </li>\n        </ul>\n        <form class=\"d-flex ms-auto\" role=\"search\" action=\"/search\" method=\"get\">\n            <input class=\"form-control me-2\" type=\"search\" name=\"q\" placeholder=\"Search\"\n                   aria-label=\"Search\" value=\"{{ .q }}\">\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n\n        <div class=\"ms-3\">\n            <i class=\"fa-solid fa-cart-shopping fa-xl\"></i>\n        </div>\n\n        {{ if .user_id }}\n        <div class=\"dropdown\">\n            <div class=\"ms-3 dropdown-toggle\" data-bs-toggle=\"dropdown\">\n                <i class=\"fa-solid fa-user fa-lg\"></i>\n                <span>Hello</span>\n            </div>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Order Center</a></li>\n                <li>\n                    <form action=\"/auth/logout\" method=\"post\">\n                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                    </form>\n                </li>\n            </ul>\n        </div>\n        {{ else }}\n        <div class=\"ms-3\">\n        <a type=\"button\" class=\"btn btn-primary\" href=\"/sign-in\">Sign In</a>\n        </div>\n        {{ end }}\n        </div>\n    </div>\n    </nav>\n    <div class=\"text-bg-primary text-center\">\n    <p>This Website is hosted for demo purposes only.It is not an actual shop</p>\n    </div>\n</header>\n<main style=\"min-height: calc(80vh);\">\n<div class=\"container-fluid py-3\">\n<h1 class=\"text-center\">{{$.title}}</h1>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/home.tmpl",
    "content": "{{define \"home\"}}\n{{template \"header\" .}}\n    <div class=\"row\">\n      {{range .items}}\n      <div class=\"card col-xl-3 col-lg-4 col-md-6 col-sm-12 p-5 border-0\" >\n        <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n          <img src=\"{{.Picture}}\" class=\"card-img-top\" alt=\"...\">\n          <div class=\"card-body\">\n            <p class=\"card-text\">{{ .Name}}</p>\n            <h5 class=\"card-title\">{{ .Price}}</h5>\n          </div>\n        </a>\n      </div>\n      {{end}}\n    </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/product.tmpl",
    "content": "{{ define \"product\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div id=\"productPicture\" class=\"carousel slide col-lg-6 col-sm-12\">\n                    <div class=\"carousel-indicators\">\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"0\"\n                                class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"1\"\n                                aria-label=\"Slide 2\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"2\"\n                                aria-label=\"Slide 3\"></button>\n                    </div>\n                    <div class=\"carousel-inner\">\n                        <div class=\"carousel-item active\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                    </div>\n                    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"prev\">\n                        <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Previous</span>\n                    </button>\n                    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"next\">\n                        <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Next</span>\n                    </button>\n                </div>\n                <div class=\"col-lg-1\"></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-center\">\n                    <form action=\"/cart\" method=\"post\">\n                        <h5 class=\"card-title\">{{ .item.Name }}</h5>\n                        <p class=\"card-text\">{{ .item.Description }}</p>\n                        <p class=\"card-text\">${{ .item.Price }}</p>\n                        <input type=\"hidden\" value=\"{{ .item.Id }}\" name=\"productId\">\n                        <label for=\"productNum\">数量：</label>\n                        <input type=\"number\" class=\"form-control mt-3\" id=\"productNum\" name=\"productNum\" value=\"1\"\n                               min=\"1\"/>\n                        <input type=\"submit\" class=\"btn btn-primary mt-3\" value=\"Add to Cart\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/required.tmpl",
    "content": "{{ define \"required\" }}\n<span class=\"text-danger\">*</span>\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/search.tmpl",
    "content": "{{ define \"search\" }}\n    {{ template \"header\" . }}\n    {{ if .q }}\n        <div class=\"d-inline-block border border-success rounded-4 p-1 ps-4 pe-4\">\n            <div>\n                {{ .q }}\n                <a href=\"/\" class=\"ps-4\">\n                    <button type=\"button\" class=\"btn btn-sm btn-danger\" aria-label=\"Close\">X</button>\n                </a>\n            </div>\n        </div>\n    {{ end}}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/sign-in.tmpl",
    "content": "{{define \"sign-in\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/login?next={{ .next }}\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign Up</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign In</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/template/sign-up.tmpl",
    "content": "{{define \"sign-up\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password_confirm\" class=\"form-label\">Password Confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password_confirm\" name=\"password_confirm\">\n              </div>\n            <div class=\"mb-3\">\n                Already have a account, click here to <a href=\"/sign-in\">Sign In</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign Up</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\ntype SessionUserIdKey string\n\nconst SessionUserId SessionUserIdKey = \"user_id\"\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) int32 {\n\tuserId := ctx.Value(SessionUserId)\n\tif userId == nil {\n\t\treturn 0\n\t}\n\treturn userId.(int32)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n.env"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.Product{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Product{},\n\t\t\t&model.Category{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `product`.`category` VALUES (1,'2023-12-06 15:05:06','2023-12-06 15:05:06','T-Shirt','T-Shirt'),(2,'2023-12-06 15:05:06','2023-12-06 15:05:06','Sticker','Sticker')\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product` VALUES ( 1, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Notebook', 'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ', '/static/image/notebook.jpeg', 9.90 ), ( 2, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Mouse-Pad', 'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ', '/static/image/mouse-pad.jpeg', 8.80 ), ( 3, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt.jpeg', 6.60 ), ( 4, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-1.jpeg', 2.20 ), ( 5, '2023-12-06 15:26:19', '2023-12-09 22:32:35', 'Sweatshirt', 'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.', '/static/image/sweatshirt.jpeg', 1.10 ), ( 6, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-2.jpeg', 1.80 ), ( 7, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'mascot', 'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.', '/static/image/logo.jpg', 4.80 )\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product_category` (product_id,category_id) VALUES ( 1, 2 ), ( 2, 2 ), ( 3, 1 ), ( 4, 1 ), ( 5, 1 ), ( 6, 1 ),( 7, 2 )\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/model/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Category struct {\n\tBase\n\tName        string `json:\"name\"`\n\tDescription string `json:\"description\"`\n\n\tProducts []Product `json:\"product\" gorm:\"many2many:product_category\"`\n}\n\nfunc (c Category) TableName() string {\n\treturn \"category\"\n}\n\ntype CategoryQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (c CategoryQuery) GetProductsByCategoryName(name string) (categories []Category, err error) {\n\terr = c.db.WithContext(c.ctx).Model(&Category{}).Where(&Category{Name: name}).Preload(\"Products\").Find(&categories).Error\n\treturn\n}\n\nfunc NewCategoryQuery(ctx context.Context, db *gorm.DB) *CategoryQuery {\n\treturn &CategoryQuery{\n\t\tctx: ctx,\n\t\tdb:  db,\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/model/product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tBase\n\tName        string  `json:\"name\"`\n\tDescription string  `json:\"description\"`\n\tPicture     string  `json:\"picture\"`\n\tPrice       float32 `json:\"price\"`\n\n\tCategories []Category `json:\"categories\" gorm:\"many2many:product_category\"`\n}\n\nfunc (p Product) TableName() string {\n\treturn \"product\"\n}\n\ntype ProductQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (p ProductQuery) GetById(productId int) (product Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).First(&product, productId).Error\n\treturn\n}\n\nfunc (p ProductQuery) SearchProducts(q string) (products []*Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).Find(&products, \"name like ? or description like ?\",\n\t\t\"%\"+q+\"%\", \"%\"+q+\"%\",\n\t).Error\n\treturn\n}\n\nfunc NewProductQuery(ctx context.Context, db *gorm.DB) *ProductQuery {\n\treturn &ProductQuery{\n\t\tctx: ctx,\n\t\tdb:  db,\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetProductService struct {\n\tctx context.Context\n} // NewGetProductService new GetProductService\nfunc NewGetProductService(ctx context.Context) *GetProductService {\n\treturn &GetProductService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetProductService) Run(req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tif req.Id == 0 {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(2004001, \"product id is required\")\n\t}\n\tproductQuery := model.NewProductQuery(s.ctx, mysql.DB)\n\n\tp, err := productQuery.GetById(int(req.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &product.GetProductResp{\n\t\tProduct: &product.Product{\n\t\t\tId:          uint32(p.ID),\n\t\t\tPicture:     p.Picture,\n\t\t\tPrice:       p.Price,\n\t\t\tDescription: p.Description,\n\t\t\tName:        p.Name,\n\t\t},\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/service/get_product_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"testing\"\n)\n\nfunc TestGetProduct_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewGetProductService(ctx)\n\t// init req and assert value\n\n\treq := &product.GetProductReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/service/list_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype ListProductsService struct {\n\tctx context.Context\n} // NewListProductsService new ListProductsService\nfunc NewListProductsService(ctx context.Context) *ListProductsService {\n\treturn &ListProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListProductsService) Run(req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\t// Finish your business logic.\n\tcategoryQuery := model.NewCategoryQuery(s.ctx, mysql.DB)\n\n\tc, err := categoryQuery.GetProductsByCategoryName(req.CategoryName)\n\tresp = &product.ListProductsResp{}\n\tfor _, v1 := range c {\n\t\tfor _, v := range v1.Products {\n\t\t\tresp.Products = append(resp.Products, &product.Product{\n\t\t\t\tId:          uint32(v.ID),\n\t\t\t\tName:        v.Name,\n\t\t\t\tDescription: v.Description,\n\t\t\t\tPicture:     v.Picture,\n\t\t\t\tPrice:       v.Price,\n\t\t\t})\n\t\t}\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/service/list_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"testing\"\n)\n\nfunc TestListProducts_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewListProductsService(ctx)\n\t// init req and assert value\n\n\treq := &product.ListProductsReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype SearchProductsService struct {\n\tctx context.Context\n} // NewSearchProductsService new SearchProductsService\nfunc NewSearchProductsService(ctx context.Context) *SearchProductsService {\n\treturn &SearchProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SearchProductsService) Run(req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\t// Finish your business logic.\n\tproductQuery := model.NewProductQuery(s.ctx, mysql.DB)\n\tproducts, err := productQuery.SearchProducts(req.Query)\n\tvar results []*product.Product\n\tfor _, v := range products {\n\t\tresults = append(results, &product.Product{\n\t\t\tId:          uint32(v.ID),\n\t\t\tName:        v.Name,\n\t\t\tDescription: v.Description,\n\t\t\tPicture:     v.Picture,\n\t\t\tPrice:       v.Price,\n\t\t})\n\t}\n\n\treturn &product.SearchProductsResp{Results: results}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/biz/service/search_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"testing\"\n)\n\nfunc TestSearchProducts_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewSearchProductsService(ctx)\n\t// init req and assert value\n\n\treq := &product.SearchProductsReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"product\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/product\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca h1:TE5KFwos5Gxn1IHdwW05E98wZ/nM9efZe12D8h5eunA=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca/go.mod h1:0miM9JonVZc9rPFBnCJpeoPiANNzT9ZfbJR3hDlXu14=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638 h1:b7mQxlMUT7APPFecvzetyPC8fJCVOOnd0zMspF7jqwc=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/service\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\n// ProductCatalogServiceImpl implements the last service interface defined in the IDL.\ntype ProductCatalogServiceImpl struct{}\n\n// ListProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) ListProducts(ctx context.Context, req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\tresp, err = service.NewListProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetProduct implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) GetProduct(ctx context.Context, req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tresp, err = service.NewGetProductService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// SearchProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) SearchProducts(ctx context.Context, req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\tresp, err = service.NewSearchProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'product'\n  ToolVersion: 'v0.9.0'\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := productcatalogservice.NewServer(new(ProductCatalogServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}), server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/product/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/product\"\nexec \"$CURDIR/bin/product\"\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif conf.GetConf().Env != \"online\" {\n\t\terr = DB.AutoMigrate(&model.User{})\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tgorm.Model\n\tEmail          string `gorm:\"uniqueIndex;type:varchar(255) not null\"`\n\tPasswordHashed string `gorm:\"type:varchar(255) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n\nfunc Create(ctx context.Context, db *gorm.DB, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n\nfunc GetByEmail(ctx context.Context, db *gorm.DB, email string) (*User, error) {\n\tvar user User\n\terr := db.WithContext(ctx).Where(\"email = ?\", email).First(&user).Error\n\treturn &user, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\trow, err := model.GetByEmail(s.ctx, mysql.DB, req.Email)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(row.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &user.LoginResp{\n\t\tUserId: int32(row.ID),\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewLoginService(ctx)\n\t// init req and assert value\n\n\treq := &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" || req.PasswordConfirm == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\tif req.Password != req.PasswordConfirm {\n\t\treturn nil, errors.New(\"password not match\")\n\t}\n\tpasswordHashed, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(passwordHashed),\n\t}\n\terr = model.Create(s.ctx, mysql.DB, newUser)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewRegisterService(ctx)\n\t// init req and assert value\n\n\treq := &user.RegisterReq{\n\t\tEmail:           \"1demo@damin.com\",\n\t\tPassword:        \"FJODIAFUFJO\",\n\t\tPasswordConfirm: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch10/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/tutorial/ch10/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/tutorial/ch10/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(&model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"uniqueIndex;type:varchar(128) not null\"`\n\tPassword string `gorm:\"type:varchar(64) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\t// CURD\n\n\t// Create\n\t// mysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"jfiojffjsoij\"})\n\n\t// Update\n\t// mysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").Update(\"password\", \"22222222\")\n\n\t// Read\n\tvar row model.User\n\tmysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").First(&row)\n\n\tfmt.Printf(\"row: %+v\\n\", row)\n\n\t// Delete\n\t// mysql.DB.Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n\n\t// mysql.DB.Unscoped().Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.16.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.10.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/goleak v1.2.1 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=\ngithub.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=\ngo.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.16.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.10.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/goleak v1.2.1 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=\ngithub.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=\ngo.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=\ngoogle.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch10/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch10/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n      - MYSQL_DATABASE=demo_proto\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: \"redis:latest\"\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch10/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/frontend\n\t./app/product\n\t./app/user\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch10/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.14.4 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch10/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch10/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n    optional string raw_body = 50101;\n    optional string query = 50102;\n    optional string header = 50103;\n    optional string cookie = 50104;\n    optional string body = 50105;\n    optional string path = 50106;\n    optional string vd = 50107;\n    optional string form = 50108;\n    optional string js_conv = 50109;\n    optional string file_name = 50110;\n    optional string none = 50111;\n\n    // 50131~50160 used to extend field option by hz\n    optional string form_compatible = 50131;\n    optional string js_conv_compatible = 50132;\n    optional string file_name_compatible = 50133;\n    optional string none_compatible = 50134;\n    // 50135 is reserved to vt_compatible\n    // optional FieldRules vt_compatible = 50135;\n\n    optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n    optional string get = 50201;\n    optional string post = 50202;\n    optional string put = 50203;\n    optional string delete = 50204;\n    optional string patch = 50205;\n    optional string options = 50206;\n    optional string head = 50207;\n    optional string any = 50208;\n    optional string gen_path = 50301; // The path specified by the user when the client code is generated, with a higher priority than api_version\n    optional string api_version = 50302; // Specify the value of the :version variable in path when the client code is generated\n    optional string tag = 50303; // rpc tag, can be multiple, separated by commas\n    optional string name = 50304; // Name of rpc\n    optional string api_level = 50305; // Interface Level\n    optional string serializer = 50306; // Serialization method\n    optional string param = 50307; // Whether client requests take public parameters\n    optional string baseurl = 50308; // Baseurl used in ttnet routing\n    optional string handler_path = 50309; // handler_path specifies the path to generate the method\n\n    // 50331~50360 used to extend method option by hz\n    optional string handler_path_compatible = 50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n    optional int32 http_code = 50401;\n\n// 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n    optional string base_domain = 50402;\n\n    // 50731~50760 used to extend service option by hz\n    optional string base_domain_compatible = 50731;\n}\n\nextend google.protobuf.MessageOptions {\n    // optional FieldRules msg_vt = 50111;\n\n    optional string reserve = 50830;\n    // 550831 is reserved to msg_vt_compatible\n    // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch10/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch10/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/auth\";\n\nmessage LoginReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string next = 3 [(api.query)=\"next\"];\n}\n\nmessage RegisterReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string password_confirm = 3 [(api.form)=\"password_confirm\"];\n}\n\nservice AuthService {\n   rpc login(LoginReq) returns(common.Empty) {\n      option (api.post) = \"/auth/login\";\n   }\n   rpc register(RegisterReq) returns(common.Empty) {\n    option (api.post) = \"/auth/register\";\n }\n rpc logout(common.Empty) returns(common.Empty) {\n    option (api.post) = \"/auth/logout\";\n }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/idl/frontend/category_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.category;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/category\";\n\nservice CategoryService {\n    rpc Category(CategoryReq) returns (common.Empty) {\n        option (api.get) = \"/category/:category\";\n    }\n}\n\nmessage CategoryReq {\n    string category = 1 [ (api.path) = \"category\"];\n}\n\n"
  },
  {
    "path": "gomall/tutorial/ch10/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\n\nmessage Empty {}"
  },
  {
    "path": "gomall/tutorial/ch10/idl/frontend/home.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.home;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/home\";\n\nservice HomeService {\n   rpc Home(common.Empty) returns(common.Empty) {\n      option (api.get) = \"/\";\n   }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/idl/frontend/product_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.product;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/product\";\n\nservice ProductService {\n    rpc GetProduct(ProductReq) returns (common.Empty) {\n        option (api.get) = \"/product\";\n    }\n    rpc SearchProducts(SearchProductsReq) returns (common.Empty) {\n        option (api.get) = \"/search\";\n    }\n}\n\nmessage ProductReq {\n    uint32 id = 1 [ (api.query) = \"id\"];\n}\n\nmessage SearchProductsReq {\n    string q = 1 [(api.query) = \"q\"];\n}\n\n"
  },
  {
    "path": "gomall/tutorial/ch10/idl/product.proto",
    "content": "syntax = \"proto3\";\n\npackage product;\n\noption go_package =\"/product\";\n\nservice ProductCatalogService {\n    rpc ListProducts(ListProductsReq) returns (ListProductsResp) {} ;\n    rpc GetProduct(GetProductReq) returns (GetProductResp) {};\n    rpc SearchProducts (SearchProductsReq) returns (SearchProductsResp) {} ;\n}\n\nmessage ListProductsReq {\n    int32 page = 1;\n    int32 page_size = 2;\n    string category_name = 3;\n}\n\nmessage Product {\n    uint32 id = 1;\n    string name = 2;\n    string description = 3;\n    string picture = 4;\n    float price = 5;\n\n    repeated string categories = 6;\n}\n\nmessage ListProductsResp {\n    repeated Product products = 1;\n}\n\nmessage GetProductReq {\n    uint32 id = 1;\n}\n\nmessage GetProductResp {\n    Product product = 1;\n}\n\nmessage SearchProductsReq {\n    string query = 1;\n}\n\nmessage SearchProductsResp {\n    repeated Product results = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/idl/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"/user\";\n\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string password_confirm = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email = 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n\nservice UserService {\n  rpc Register (RegisterReq) returns (RegisterResp) {}\n  rpc Login (LoginReq) returns (LoginResp) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.5\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgoogle.golang.org/protobuf v1.36.6\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/product/product.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *ListProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsReq[number], err)\n}\n\nfunc (x *ListProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Page, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.PageSize, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CategoryName, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Product[number], err)\n}\n\nfunc (x *Product) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Name, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Description, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Picture, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Price, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v string\n\tv, offset, err = fastpb.ReadString(buf, _type)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Categories = append(x.Categories, v)\n\treturn offset, err\n}\n\nfunc (x *ListProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsResp[number], err)\n}\n\nfunc (x *ListProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Products = append(x.Products, &v)\n\treturn offset, nil\n}\n\nfunc (x *GetProductReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductReq[number], err)\n}\n\nfunc (x *GetProductReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetProductResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductResp[number], err)\n}\n\nfunc (x *GetProductResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Product = &v\n\treturn offset, nil\n}\n\nfunc (x *SearchProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsReq[number], err)\n}\n\nfunc (x *SearchProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Query, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *SearchProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsResp[number], err)\n}\n\nfunc (x *SearchProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Results = append(x.Results, &v)\n\treturn offset, nil\n}\n\nfunc (x *ListProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Page == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetPage())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.PageSize == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetPageSize())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.CategoryName == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetCategoryName())\n\treturn offset\n}\n\nfunc (x *Product) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField2(buf []byte) (offset int) {\n\tif x.Name == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetName())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField3(buf []byte) (offset int) {\n\tif x.Description == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetDescription())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField4(buf []byte) (offset int) {\n\tif x.Picture == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetPicture())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField5(buf []byte) (offset int) {\n\tif x.Price == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 5, x.GetPrice())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField6(buf []byte) (offset int) {\n\tif len(x.Categories) == 0 {\n\t\treturn offset\n\t}\n\tfor i := range x.GetCategories() {\n\t\toffset += fastpb.WriteString(buf[offset:], 6, x.GetCategories()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Products == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetProducts() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProducts()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *GetProductReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *GetProductResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Product == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProduct())\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Query == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetQuery())\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Results == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetResults() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetResults()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField1() (n int) {\n\tif x.Page == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetPage())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField2() (n int) {\n\tif x.PageSize == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetPageSize())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField3() (n int) {\n\tif x.CategoryName == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetCategoryName())\n\treturn n\n}\n\nfunc (x *Product) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Product) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *Product) sizeField2() (n int) {\n\tif x.Name == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetName())\n\treturn n\n}\n\nfunc (x *Product) sizeField3() (n int) {\n\tif x.Description == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetDescription())\n\treturn n\n}\n\nfunc (x *Product) sizeField4() (n int) {\n\tif x.Picture == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetPicture())\n\treturn n\n}\n\nfunc (x *Product) sizeField5() (n int) {\n\tif x.Price == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(5, x.GetPrice())\n\treturn n\n}\n\nfunc (x *Product) sizeField6() (n int) {\n\tif len(x.Categories) == 0 {\n\t\treturn n\n\t}\n\tfor i := range x.GetCategories() {\n\t\tn += fastpb.SizeString(6, x.GetCategories()[i])\n\t}\n\treturn n\n}\n\nfunc (x *ListProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListProductsResp) sizeField1() (n int) {\n\tif x.Products == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetProducts() {\n\t\tn += fastpb.SizeMessage(1, x.GetProducts()[i])\n\t}\n\treturn n\n}\n\nfunc (x *GetProductReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductReq) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *GetProductResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductResp) sizeField1() (n int) {\n\tif x.Product == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetProduct())\n\treturn n\n}\n\nfunc (x *SearchProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsReq) sizeField1() (n int) {\n\tif x.Query == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetQuery())\n\treturn n\n}\n\nfunc (x *SearchProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsResp) sizeField1() (n int) {\n\tif x.Results == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetResults() {\n\t\tn += fastpb.SizeMessage(1, x.GetResults()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_ListProductsReq = map[int32]string{\n\t1: \"Page\",\n\t2: \"PageSize\",\n\t3: \"CategoryName\",\n}\n\nvar fieldIDToName_Product = map[int32]string{\n\t1: \"Id\",\n\t2: \"Name\",\n\t3: \"Description\",\n\t4: \"Picture\",\n\t5: \"Price\",\n\t6: \"Categories\",\n}\n\nvar fieldIDToName_ListProductsResp = map[int32]string{\n\t1: \"Products\",\n}\n\nvar fieldIDToName_GetProductReq = map[int32]string{\n\t1: \"Id\",\n}\n\nvar fieldIDToName_GetProductResp = map[int32]string{\n\t1: \"Product\",\n}\n\nvar fieldIDToName_SearchProductsReq = map[int32]string{\n\t1: \"Query\",\n}\n\nvar fieldIDToName_SearchProductsResp = map[int32]string{\n\t1: \"Results\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/product/product.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: product.proto\n\npackage product\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPage         int32  `protobuf:\"varint,1,opt,name=page,proto3\" json:\"page,omitempty\"`\n\tPageSize     int32  `protobuf:\"varint,2,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\tCategoryName string `protobuf:\"bytes,3,opt,name=category_name,json=categoryName,proto3\" json:\"category_name,omitempty\"`\n}\n\nfunc (x *ListProductsReq) Reset() {\n\t*x = ListProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsReq) ProtoMessage() {}\n\nfunc (x *ListProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsReq.ProtoReflect.Descriptor instead.\nfunc (*ListProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListProductsReq) GetPage() int32 {\n\tif x != nil {\n\t\treturn x.Page\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetCategoryName() string {\n\tif x != nil {\n\t\treturn x.CategoryName\n\t}\n\treturn \"\"\n}\n\ntype Product struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          uint32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string   `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tPicture     string   `protobuf:\"bytes,4,opt,name=picture,proto3\" json:\"picture,omitempty\"`\n\tPrice       float32  `protobuf:\"fixed32,5,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tCategories  []string `protobuf:\"bytes,6,rep,name=categories,proto3\" json:\"categories,omitempty\"`\n}\n\nfunc (x *Product) Reset() {\n\t*x = Product{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Product) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Product) ProtoMessage() {}\n\nfunc (x *Product) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Product.ProtoReflect.Descriptor instead.\nfunc (*Product) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Product) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPicture() string {\n\tif x != nil {\n\t\treturn x.Picture\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPrice() float32 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetCategories() []string {\n\tif x != nil {\n\t\treturn x.Categories\n\t}\n\treturn nil\n}\n\ntype ListProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProducts []*Product `protobuf:\"bytes,1,rep,name=products,proto3\" json:\"products,omitempty\"`\n}\n\nfunc (x *ListProductsResp) Reset() {\n\t*x = ListProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsResp) ProtoMessage() {}\n\nfunc (x *ListProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsResp.ProtoReflect.Descriptor instead.\nfunc (*ListProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListProductsResp) GetProducts() []*Product {\n\tif x != nil {\n\t\treturn x.Products\n\t}\n\treturn nil\n}\n\ntype GetProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetProductReq) Reset() {\n\t*x = GetProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductReq) ProtoMessage() {}\n\nfunc (x *GetProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductReq.ProtoReflect.Descriptor instead.\nfunc (*GetProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetProductResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProduct *Product `protobuf:\"bytes,1,opt,name=product,proto3\" json:\"product,omitempty\"`\n}\n\nfunc (x *GetProductResp) Reset() {\n\t*x = GetProductResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductResp) ProtoMessage() {}\n\nfunc (x *GetProductResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductResp.ProtoReflect.Descriptor instead.\nfunc (*GetProductResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetProductResp) GetProduct() *Product {\n\tif x != nil {\n\t\treturn x.Product\n\t}\n\treturn nil\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *SearchProductsReq) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\ntype SearchProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*Product `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *SearchProductsResp) Reset() {\n\t*x = SearchProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsResp) ProtoMessage() {}\n\nfunc (x *SearchProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsResp.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SearchProductsResp) GetResults() []*Product {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_product_proto protoreflect.FileDescriptor\n\nvar file_product_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x67, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12,\n\t0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d,\n\t0x65, 0x22, 0x9f, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a,\n\t0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72,\n\t0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65,\n\t0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,\n\t0x69, 0x65, 0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65,\n\t0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22,\n\t0x40, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,\n\t0x73, 0x32, 0xec, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x61, 0x74,\n\t0x61, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x4c,\n\t0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e,\n\t0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73,\n\t0x70, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e,\n\t0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65,\n\t0x71, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72,\n\t0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63,\n\t0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d,\n\t0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_proto_rawDescOnce sync.Once\n\tfile_product_proto_rawDescData = file_product_proto_rawDesc\n)\n\nfunc file_product_proto_rawDescGZIP() []byte {\n\tfile_product_proto_rawDescOnce.Do(func() {\n\t\tfile_product_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_proto_rawDescData)\n\t})\n\treturn file_product_proto_rawDescData\n}\n\nvar file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_product_proto_goTypes = []interface{}{\n\t(*ListProductsReq)(nil),    // 0: product.ListProductsReq\n\t(*Product)(nil),            // 1: product.Product\n\t(*ListProductsResp)(nil),   // 2: product.ListProductsResp\n\t(*GetProductReq)(nil),      // 3: product.GetProductReq\n\t(*GetProductResp)(nil),     // 4: product.GetProductResp\n\t(*SearchProductsReq)(nil),  // 5: product.SearchProductsReq\n\t(*SearchProductsResp)(nil), // 6: product.SearchProductsResp\n}\nvar file_product_proto_depIdxs = []int32{\n\t1, // 0: product.ListProductsResp.products:type_name -> product.Product\n\t1, // 1: product.GetProductResp.product:type_name -> product.Product\n\t1, // 2: product.SearchProductsResp.results:type_name -> product.Product\n\t0, // 3: product.ProductCatalogService.ListProducts:input_type -> product.ListProductsReq\n\t3, // 4: product.ProductCatalogService.GetProduct:input_type -> product.GetProductReq\n\t5, // 5: product.ProductCatalogService.SearchProducts:input_type -> product.SearchProductsReq\n\t2, // 6: product.ProductCatalogService.ListProducts:output_type -> product.ListProductsResp\n\t4, // 7: product.ProductCatalogService.GetProduct:output_type -> product.GetProductResp\n\t6, // 8: product.ProductCatalogService.SearchProducts:output_type -> product.SearchProductsResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_product_proto_init() }\nfunc file_product_proto_init() {\n\tif File_product_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Product); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_proto_goTypes,\n\t\tDependencyIndexes: file_product_proto_depIdxs,\n\t\tMessageInfos:      file_product_proto_msgTypes,\n\t}.Build()\n\tFile_product_proto = out.File\n\tfile_product_proto_rawDesc = nil\n\tfile_product_proto_goTypes = nil\n\tfile_product_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\ntype ProductCatalogService interface {\n\tListProducts(ctx context.Context, req *ListProductsReq) (res *ListProductsResp, err error)\n\tGetProduct(ctx context.Context, req *GetProductReq) (res *GetProductResp, err error)\n\tSearchProducts(ctx context.Context, req *SearchProductsReq) (res *SearchProductsResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/product/productcatalogservice/client.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductCatalogServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductCatalogServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductCatalogServiceClient) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.SearchProducts(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/product/productcatalogservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductCatalogService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/product/productcatalogservice/productcatalogservice.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"ListProducts\": kitex.NewMethodInfo(\n\t\tlistProductsHandler,\n\t\tnewListProductsArgs,\n\t\tnewListProductsResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"GetProduct\": kitex.NewMethodInfo(\n\t\tgetProductHandler,\n\t\tnewGetProductArgs,\n\t\tnewGetProductResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"SearchProducts\": kitex.NewMethodInfo(\n\t\tsearchProductsHandler,\n\t\tnewSearchProductsArgs,\n\t\tnewSearchProductsResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tproductCatalogServiceServiceInfo                = NewServiceInfo()\n\tproductCatalogServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tproductCatalogServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"ProductCatalogService\"\n\thandlerType := (*product.ProductCatalogService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"product\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.ListProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).ListProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *ListProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).ListProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListProductsResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newListProductsArgs() interface{} {\n\treturn &ListProductsArgs{}\n}\n\nfunc newListProductsResult() interface{} {\n\treturn &ListProductsResult{}\n}\n\ntype ListProductsArgs struct {\n\tReq *product.ListProductsReq\n}\n\nfunc (p *ListProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.ListProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListProductsArgs_Req_DEFAULT *product.ListProductsReq\n\nfunc (p *ListProductsArgs) GetReq() *product.ListProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn ListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListProductsResult struct {\n\tSuccess *product.ListProductsResp\n}\n\nvar ListProductsResult_Success_DEFAULT *product.ListProductsResp\n\nfunc (p *ListProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.ListProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListProductsResult) GetSuccess() *product.ListProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.ListProductsResp)\n}\n\nfunc (p *ListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.GetProductReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).GetProduct(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *GetProductArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).GetProduct(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetProductResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newGetProductArgs() interface{} {\n\treturn &GetProductArgs{}\n}\n\nfunc newGetProductResult() interface{} {\n\treturn &GetProductResult{}\n}\n\ntype GetProductArgs struct {\n\tReq *product.GetProductReq\n}\n\nfunc (p *GetProductArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.GetProductReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetProductArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetProductArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetProductArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetProductArgs_Req_DEFAULT *product.GetProductReq\n\nfunc (p *GetProductArgs) GetReq() *product.GetProductReq {\n\tif !p.IsSetReq() {\n\t\treturn GetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetProductResult struct {\n\tSuccess *product.GetProductResp\n}\n\nvar GetProductResult_Success_DEFAULT *product.GetProductResp\n\nfunc (p *GetProductResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.GetProductResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetProductResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetProductResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetProductResult) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetProductResult) GetSuccess() *product.GetProductResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.GetProductResp)\n}\n\nfunc (p *GetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc searchProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.SearchProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).SearchProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *SearchProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).SearchProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SearchProductsResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newSearchProductsArgs() interface{} {\n\treturn &SearchProductsArgs{}\n}\n\nfunc newSearchProductsResult() interface{} {\n\treturn &SearchProductsResult{}\n}\n\ntype SearchProductsArgs struct {\n\tReq *product.SearchProductsReq\n}\n\nfunc (p *SearchProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.SearchProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SearchProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SearchProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SearchProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SearchProductsArgs_Req_DEFAULT *product.SearchProductsReq\n\nfunc (p *SearchProductsArgs) GetReq() *product.SearchProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn SearchProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SearchProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SearchProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SearchProductsResult struct {\n\tSuccess *product.SearchProductsResp\n}\n\nvar SearchProductsResult_Success_DEFAULT *product.SearchProductsResp\n\nfunc (p *SearchProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.SearchProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SearchProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SearchProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SearchProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SearchProductsResult) GetSuccess() *product.SearchProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SearchProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SearchProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.SearchProductsResp)\n}\n\nfunc (p *SearchProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SearchProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, Req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args ListProductsArgs\n\t_args.Req = Req\n\tvar _result ListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, Req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args GetProductArgs\n\t_args.Req = Req\n\tvar _result GetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq) (r *product.SearchProductsResp, err error) {\n\tvar _args SearchProductsArgs\n\t_args.Req = Req\n\tvar _result SearchProductsResult\n\tif err = p.c.Call(ctx, \"SearchProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/product/productcatalogservice/server.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductCatalogService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler product.ProductCatalogService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.PasswordConfirm, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetPasswordConfirm())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetPasswordConfirm())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"PasswordConfirm\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Register\": kitex.NewMethodInfo(registerHandler, newRegisterArgs, newRegisterResult, false),\n\t\t\"Login\":    kitex.NewMethodInfo(loginHandler, newLoginArgs, newLoginResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"user\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/rpc/product/product_client.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() productcatalogservice.Client\n\tService() string\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := productcatalogservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient productcatalogservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() productcatalogservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\treturn c.kitexClient.ListProducts(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\treturn c.kitexClient.GetProduct(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\treturn c.kitexClient.SearchProducts(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/rpc/product/product_default.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (resp *product.ListProductsResp, err error) {\n\tresp, err = defaultClient.ListProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (resp *product.GetProductResp, err error) {\n\tresp, err = defaultClient.GetProduct(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetProduct call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc SearchProducts(ctx context.Context, req *product.SearchProductsReq, callOptions ...callopt.Option) (resp *product.SearchProductsResp, err error) {\n\tresp, err = defaultClient.SearchProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"SearchProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/rpc/product/product_init.go",
    "content": "package product\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"product\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch10/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/.gitignore",
    "content": "app/*/tmp\napp/*/.env\napp/*/log"
  },
  {
    "path": "gomall/tutorial/ch11/Makefile",
    "content": "export ROOT_MOD=github.com/cloudwego/biz-demo/gomall\n.PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module ${ROOT_MOD}/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module  ${ROOT_MOD}/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module ${ROOT_MOD}/app/frontend --idl ../../idl/frontend/cart_page.proto\n\n.PHONY: gen-user\ngen-user: \n\t@cd rpc_gen && cwgo client --type RPC --service user --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/user.proto\n\t@cd app/user && cwgo server --type RPC --service user --module ${ROOT_MOD}/app/user --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/user.proto\n\n.PHONY: gen-product\ngen-product: \n\t@cd rpc_gen && cwgo client --type RPC --service product --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/product.proto\n\t@cd app/product && cwgo server --type RPC --service product --module ${ROOT_MOD}/app/product --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/product.proto\n\n.PHONY: gen-cart\ngen-cart: \n\t@cd rpc_gen && cwgo client --type RPC --service cart --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/cart.proto\n\t@cd app/cart && cwgo server --type RPC --service cart --module ${ROOT_MOD}/app/cart --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/cart.proto\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t//redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\terr = DB.AutoMigrate(&model.Cart{})\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/model/cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Cart struct {\n\tgorm.Model\n\tUserId    uint32 `gorm:\"type:int(11);not null;index:idx_user_id\"`\n\tProductId uint32 `gorm:\"type:int(11);not null;\"`\n\tQty       uint32 `gorm:\"type:int(11);not null;\"`\n}\n\nfunc (Cart) TableName() string {\n\treturn \"cart\"\n}\n\nfunc AddItem(ctx context.Context, db *gorm.DB, item *Cart) error {\n\tvar row Cart\n\terr := db.WithContext(ctx).\n\t\tModel(&Cart{}).\n\t\tWhere(&Cart{UserId: item.UserId, ProductId: item.ProductId}).\n\t\tFirst(&row).Error\n\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\treturn err\n\t}\n\tif row.ID > 0 {\n\t\treturn db.WithContext(ctx).\n\t\t\tModel(&Cart{}).\n\t\t\tWhere(&Cart{UserId: item.UserId, ProductId: item.ProductId}).\n\t\t\tUpdateColumn(\"qty\", gorm.Expr(\"qty+?\", item.Qty)).Error\n\t}\n\n\treturn db.WithContext(ctx).Create(item).Error\n}\n\nfunc EmptyCart(ctx context.Context, db *gorm.DB, userId uint32) error {\n\tif userId == 0 {\n\t\treturn errors.New(\"user id is required\")\n\t}\n\treturn db.WithContext(ctx).Delete(&Cart{}, \"user_id = ?\", userId).Error\n}\n\nfunc GetCartByUserId(ctx context.Context, db *gorm.DB, userId uint32) ([]*Cart, error) {\n\tvar rows []*Cart\n\terr := db.WithContext(ctx).\n\t\tModel(&Cart{}).\n\t\tWhere(&Cart{UserId: userId}).\n\t\tFind(&rows).Error\n\treturn rows, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/service/add_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype AddItemService struct {\n\tctx context.Context\n} // NewAddItemService new AddItemService\nfunc NewAddItemService(ctx context.Context) *AddItemService {\n\treturn &AddItemService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *AddItemService) Run(req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\t// Finish your business logic.\n\tproductResp, err := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: req.Item.ProductId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif productResp == nil || productResp.Product.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40004, \"product not found\")\n\t}\n\n\tcartItem := &model.Cart{\n\t\tUserId:    req.UserId,\n\t\tProductId: req.Item.ProductId,\n\t\tQty:       req.Item.Quantity,\n\t}\n\n\terr = model.AddItem(s.ctx, mysql.DB, cartItem)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\n\treturn &cart.AddItemResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/service/add_item_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\nfunc TestAddItem_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewAddItemService(ctx)\n\t// init req and assert value\n\n\treq := &cart.AddItemReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/service/empty_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype EmptyCartService struct {\n\tctx context.Context\n} // NewEmptyCartService new EmptyCartService\nfunc NewEmptyCartService(ctx context.Context) *EmptyCartService {\n\treturn &EmptyCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EmptyCartService) Run(req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\t// Finish your business logic.\n\terr = model.EmptyCart(s.ctx, mysql.DB, req.UserId)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50001, err.Error())\n\t}\n\treturn &cart.EmptyCartResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/service/empty_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\nfunc TestEmptyCart_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEmptyCartService(ctx)\n\t// init req and assert value\n\n\treq := &cart.EmptyCartReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetCartService struct {\n\tctx context.Context\n} // NewGetCartService new GetCartService\nfunc NewGetCartService(ctx context.Context) *GetCartService {\n\treturn &GetCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetCartService) Run(req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\t// Finish your business logic.\n\tlist, err := model.GetCartByUserId(s.ctx, mysql.DB, req.UserId)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50002, err.Error())\n\t}\n\tvar items []*cart.CartItem\n\tfor _, item := range list {\n\t\titems = append(items, &cart.CartItem{\n\t\t\tProductId: item.ProductId,\n\t\t\tQuantity:  item.Qty,\n\t\t})\n\t}\n\treturn &cart.GetCartResp{Items: items}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/biz/service/get_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\nfunc TestGetCart_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewGetCartService(ctx)\n\t// init req and assert value\n\n\treq := &cart.GetCartReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cart\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/cart?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/cart?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/cart?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/cart\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/go-version v1.6.0 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.34.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/service\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\n// CartServiceImpl implements the last service interface defined in the IDL.\ntype CartServiceImpl struct{}\n\n// AddItem implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) AddItem(ctx context.Context, req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\tresp, err = service.NewAddItemService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) GetCart(ctx context.Context, req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\tresp, err = service.NewGetCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// EmptyCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) EmptyCart(ctx context.Context, req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = service.NewEmptyCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\tcartutils \"github.com/cloudwego/biz-demo/gomall/app/cart/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tProductClient productcatalogservice.Client\n\tonce          sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitProductClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcartutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcartutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'cart'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\trpc.InitClient()\n\n\topts := kitexInit()\n\tsvr := cartservice.NewServer(new(CartServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}), server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/cart\"\nexec \"$CURDIR/bin/cart\"\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/cart/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(redirect))\n}\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/cart/cart_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetCart .\n// @router /cart [GET]\nfunc GetCart(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetCartService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, resp))\n}\n\n// AddCartItem .\n// @router /cart [POST]\nfunc AddCartItem(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req cart.AddCartItemReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewAddCartItemService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/cart\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/cart/cart_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetCart(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/cart\", GetCart)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestAddCartItem(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/cart\", AddCartItem)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/category/category_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Category .\n// @router /category/:category [GET]\nfunc Category(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req category.CategoryReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewCategoryService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"category\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/category/category_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCategory(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/category/:category\", Category)\n\tpath := \"/category/:category\"                             // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/product/product_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetProduct .\n// @router /product [GET]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.ProductReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetProductService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"product\", utils.WarpResponse(ctx, c, resp))\n}\n\n// SearchProducts .\n// @router /search [GET]\nfunc SearchProducts(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.SearchProductsReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewSearchProductsService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"search\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/handler/product/product_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetProduct(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/product\", GetProduct)\n\tpath := \"/product\"                                        // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestSearchProducts(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/search\", SearchProducts)\n\tpath := \"/search\"                                         // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/cart/cart_page.go",
    "content": "// Code generated by hertz generator. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.POST(\"/cart\", append(_addcartitemMw(), cart.AddCartItem)...)\n\troot.GET(\"/cart\", append(_getcartMw(), cart.GetCart)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/cart/middleware.go",
    "content": "// Code generated by hertz generator.\n\npackage cart\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _getcartMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _addcartitemMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/category/category_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage category\n\nimport (\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/category\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_category := root.Group(\"/category\", _categoryMw()...)\n\t\t_category.GET(\"/:category\", append(_category0Mw(), category.Category)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/category/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage category\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _categoryMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _category0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/product/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage product\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getproductMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _searchproductsMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/product/product_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage product\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/product\", append(_getproductMw(), product.GetProduct)...)\n\troot.GET(\"/search\", append(_searchproductsMw(), product.SearchProducts)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/cart\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/category\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\tcart.Register(r)\n\n\tcategory.Register(r)\n\n\tproduct.Register(r)\n\n\tauth.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/service/add_cart_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype AddCartItemService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewAddCartItemService(Context context.Context, RequestContext *app.RequestContext) *AddCartItemService {\n\treturn &AddCartItemService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *AddCartItemService) Run(req *cart.AddCartItemReq) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\t_, err = rpc.CartClient.AddItem(h.Context, &rpccart.AddItemReq{\n\t\tUserId: uint32(frontendUtils.GetUserIdFromCtx(h.Context)),\n\t\tItem: &rpccart.CartItem{\n\t\t\tProductId: req.ProductId,\n\t\t\tQuantity:  uint32(req.ProductNum),\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/service/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CategoryService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCategoryService(Context context.Context, RequestContext *app.RequestContext) *CategoryService {\n\treturn &CategoryService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CategoryService) Run(req *category.CategoryReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{CategoryName: req.Category})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"title\": \"Category\",\n\t\t\"items\": p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetCartService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetCartService(Context context.Context, RequestContext *app.RequestContext) *GetCartService {\n\treturn &GetCartService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetCartService) Run(req *common.Empty) (resp map[string]any, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tcartResp, err := rpc.CartClient.GetCart(h.Context, &cart.GetCartReq{\n\t\tUserId: uint32(frontendUtils.GetUserIdFromCtx(h.Context)),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar items []map[string]string\n\tvar total float64\n\tfor _, item := range cartResp.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &product.GetProductReq{Id: item.ProductId})\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":        p.Name,\n\t\t\t\"Description\": p.Description,\n\t\t\t\"Price\":       strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\":     p.Picture,\n\t\t\t\"Qty\":         strconv.Itoa(int(item.Quantity)),\n\t\t})\n\t\ttotal += float64(p.Price) * float64(item.Quantity)\n\n\t}\n\treturn utils.H{\n\t\t\"title\": \"Cart\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetProductService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetProductService(Context context.Context, RequestContext *app.RequestContext) *GetProductService {\n\treturn &GetProductService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetProductService) Run(req *product.ProductReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: req.Id})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"item\": p.Product,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (res map[string]any, err error) {\n\tproducts, err := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Hot sale\",\n\t\t\"items\": products.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (redirect string, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tresp, err := rpc.UserClient.Login(h.Context, &user.LoginReq{\n\t\tEmail:    req.Email,\n\t\tPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", resp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tredirect = \"/\"\n\tif req.Next != \"\" {\n\t\tredirect = req.Next\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tuserResp, err := rpc.UserClient.Register(h.Context, &user.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tPasswordConfirm: req.PasswordConfirm,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", userResp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype SearchProductsService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewSearchProductsService(Context context.Context, RequestContext *app.RequestContext) *SearchProductsService {\n\treturn &SearchProductsService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *SearchProductsService) Run(req *product.SearchProductsReq) (resp map[string]any, err error) {\n\tproducts, err := rpc.ProductClient.SearchProducts(h.Context, &rpcproduct.SearchProductsReq{\n\t\tQuery: req.Q,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"items\": products.Results,\n\t\t\"q\":     req.Q,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tuserId := frontendUtils.GetUserIdFromCtx(ctx)\n\tcontent[\"user_id\"] = userId\n\n\tif userId > 0 {\n\t\tcartResp, err := rpc.CartClient.GetCart(ctx, &cart.GetCartReq{\n\t\t\tUserId: uint32(userId),\n\t\t})\n\t\tif err == nil && cartResp != nil {\n\t\t\tcontent[\"cart_num\"] = len(cartResp.Items)\n\t\t}\n\t}\n\n\treturn content\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.8.1\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115\n\tgithub.com/hertz-contrib/logger/logrus v1.0.1\n\tgithub.com/hertz-contrib/pprof v0.1.2\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgoogle.golang.org/protobuf v1.34.1\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.8.1 h1:3Upzd9o5yNPz6rLx70J5xpo5emosKNkmwW00WgQhf/0=\ngithub.com/cloudwego/hertz v0.8.1/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115 h1:EvTFSVPZhC2O2i3Krhutdje4sSXSc4nmLTkTttKh/s0=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/logrus v1.0.1 h1:1iFu/L92QlFSDXUn77WJL32dk/5HBzAUziG1OqcNMeE=\ngithub.com/hertz-contrib/logger/logrus v1.0.1/go.mod h1:SqDYLwVq5hTItYqimgZQbFCYPOIGNvBTq0Ip2OQwMcY=\ngithub.com/hertz-contrib/pprof v0.1.2 h1:eC4jpg8ToSi+9YEOPIr3jki8e/ix3aFPtphCgJ36T6Q=\ngithub.com/hertz-contrib/pprof v0.1.2/go.mod h1:OKXw5wCUcy1OVwgQLsoCS9JzfcdjoofP+7Uk4c7P9Po=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=\ngithub.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is generated, with a higher priority than api_version\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the client code is generated\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[37]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12,\n\t0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76,\n\t0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t4,  // 37: api.reserve:extendee -> google.protobuf.MessageOptions\n\t38, // [38:38] is the sub-list for method output_type\n\t38, // [38:38] is the sub-list for method input_type\n\t38, // [38:38] is the sub-list for extension type_name\n\t0,  // [0:38] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 38,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\" form:\"password_confirm\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x73, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2,\n\t0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52,\n\t0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69,\n\t0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69,\n\t0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73,\n\t0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x12, 0x3f, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb,\n\t0x18, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,\n\t0x72, 0x6d, 0x52, 0x0f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x72, 0x6d, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x17, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x4c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0f, 0xd2,\n\t0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x52,\n\t0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,\n\t0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x12,\n\t0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,\n\t0x65, 0x72, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x4b,\n\t0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*LoginReq)(nil),     // 0: frontend.auth.LoginReq\n\t(*RegisterReq)(nil),  // 1: frontend.auth.RegisterReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t1, // 1: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/hertz_gen/frontend/cart/cart_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: cart_page.proto\n\npackage cart\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AddCartItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId  uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\" form:\"productId\"`\n\tProductNum int32  `protobuf:\"varint,2,opt,name=product_num,json=productNum,proto3\" json:\"product_num,omitempty\" form:\"productNum\"`\n}\n\nfunc (x *AddCartItemReq) Reset() {\n\t*x = AddCartItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddCartItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddCartItemReq) ProtoMessage() {}\n\nfunc (x *AddCartItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddCartItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddCartItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AddCartItemReq) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *AddCartItemReq) GetProductNum() int32 {\n\tif x != nil {\n\t\treturn x.ProductNum\n\t}\n\treturn 0\n}\n\nvar File_cart_page_proto protoreflect.FileDescriptor\n\nvar file_cart_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x6f, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65,\n\t0x6d, 0x52, 0x65, 0x71, 0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0d, 0xe2, 0xbb, 0x18, 0x09, 0x70, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x75,\n\t0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0e, 0xe2, 0xbb, 0x18, 0x0a, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x4e, 0x75, 0x6d, 0x32, 0xa4, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74,\n\t0x65, 0x6d, 0x12, 0x1d, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x72, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65,\n\t0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x09, 0xd2, 0xc1, 0x18, 0x05, 0x2f,\n\t0x63, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12,\n\t0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x09, 0xca, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x42, 0x4b, 0x5a, 0x49, 0x67, 0x69,\n\t0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65,\n\t0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61,\n\t0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f,\n\t0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_page_proto_rawDescOnce sync.Once\n\tfile_cart_page_proto_rawDescData = file_cart_page_proto_rawDesc\n)\n\nfunc file_cart_page_proto_rawDescGZIP() []byte {\n\tfile_cart_page_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_page_proto_rawDescData)\n\t})\n\treturn file_cart_page_proto_rawDescData\n}\n\nvar file_cart_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_cart_page_proto_goTypes = []interface{}{\n\t(*AddCartItemReq)(nil), // 0: frontend.cart.AddCartItemReq\n\t(*common.Empty)(nil),   // 1: frontend.common.Empty\n}\nvar file_cart_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.cart.CartService.AddCartItem:input_type -> frontend.cart.AddCartItemReq\n\t1, // 1: frontend.cart.CartService.GetCart:input_type -> frontend.common.Empty\n\t1, // 2: frontend.cart.CartService.AddCartItem:output_type -> frontend.common.Empty\n\t1, // 3: frontend.cart.CartService.GetCart:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_page_proto_init() }\nfunc file_cart_page_proto_init() {\n\tif File_cart_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddCartItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_page_proto_goTypes,\n\t\tDependencyIndexes: file_cart_page_proto_depIdxs,\n\t\tMessageInfos:      file_cart_page_proto_msgTypes,\n\t}.Build()\n\tFile_cart_page_proto = out.File\n\tfile_cart_page_proto_rawDesc = nil\n\tfile_cart_page_proto_goTypes = nil\n\tfile_cart_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/hertz_gen/frontend/category/category_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: category_page.proto\n\npackage category\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CategoryReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory string `protobuf:\"bytes,1,opt,name=category,proto3\" json:\"category,omitempty\" path:\"category\"`\n}\n\nfunc (x *CategoryReq) Reset() {\n\t*x = CategoryReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_category_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryReq) ProtoMessage() {}\n\nfunc (x *CategoryReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_category_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryReq.ProtoReflect.Descriptor instead.\nfunc (*CategoryReq) Descriptor() ([]byte, []int) {\n\treturn file_category_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CategoryReq) GetCategory() string {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn \"\"\n}\n\nvar File_category_page_proto protoreflect.FileDescriptor\n\nvar file_category_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x08, 0x63, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xd2, 0xbb, 0x18,\n\t0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x32, 0x6e, 0x0a, 0x0f, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13,\n\t0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2f, 0x3a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x42, 0x4f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d,\n\t0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_category_page_proto_rawDescOnce sync.Once\n\tfile_category_page_proto_rawDescData = file_category_page_proto_rawDesc\n)\n\nfunc file_category_page_proto_rawDescGZIP() []byte {\n\tfile_category_page_proto_rawDescOnce.Do(func() {\n\t\tfile_category_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_category_page_proto_rawDescData)\n\t})\n\treturn file_category_page_proto_rawDescData\n}\n\nvar file_category_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_category_page_proto_goTypes = []interface{}{\n\t(*CategoryReq)(nil),  // 0: frontend.category.CategoryReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_category_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.category.CategoryService.Category:input_type -> frontend.category.CategoryReq\n\t1, // 1: frontend.category.CategoryService.Category:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_category_page_proto_init() }\nfunc file_category_page_proto_init() {\n\tif File_category_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_category_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_category_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_category_page_proto_goTypes,\n\t\tDependencyIndexes: file_category_page_proto_depIdxs,\n\t\tMessageInfos:      file_category_page_proto_msgTypes,\n\t}.Build()\n\tFile_category_page_proto = out.File\n\tfile_category_page_proto_rawDesc = nil\n\tfile_category_page_proto_goTypes = nil\n\tfile_category_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x1a, 0x09, 0x61, 0x70, 0x69,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x4c, 0x0a,\n\t0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x04,\n\t0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a, 0x49, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.home.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.home.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/hertz_gen/frontend/product/product_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: product_page.proto\n\npackage product\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\" query:\"id\"`\n}\n\nfunc (x *ProductReq) Reset() {\n\t*x = ProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProductReq) ProtoMessage() {}\n\nfunc (x *ProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProductReq.ProtoReflect.Descriptor instead.\nfunc (*ProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQ string `protobuf:\"bytes,1,opt,name=q,proto3\" json:\"q,omitempty\" query:\"q\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *SearchProductsReq) GetQ() string {\n\tif x != nil {\n\t\treturn x.Q\n\t}\n\treturn \"\"\n}\n\nvar File_product_page_proto protoreflect.FileDescriptor\n\nvar file_product_page_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,\n\t0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x42, 0x06, 0xb2, 0xbb, 0x18, 0x02, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x22, 0x28,\n\t0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x12, 0x13, 0x0a, 0x01, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05,\n\t0xb2, 0xbb, 0x18, 0x01, 0x71, 0x52, 0x01, 0x71, 0x32, 0xbe, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x47,\n\t0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x0c, 0xca, 0xc1, 0x18, 0x08, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x5a, 0x0a,\n\t0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12,\n\t0x23, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0b, 0xca, 0xc1,\n\t0x18, 0x07, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74,\n\t0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67,\n\t0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c,\n\t0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68,\n\t0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_product_page_proto_rawDescOnce sync.Once\n\tfile_product_page_proto_rawDescData = file_product_page_proto_rawDesc\n)\n\nfunc file_product_page_proto_rawDescGZIP() []byte {\n\tfile_product_page_proto_rawDescOnce.Do(func() {\n\t\tfile_product_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_page_proto_rawDescData)\n\t})\n\treturn file_product_page_proto_rawDescData\n}\n\nvar file_product_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_product_page_proto_goTypes = []interface{}{\n\t(*ProductReq)(nil),        // 0: frontend.product.ProductReq\n\t(*SearchProductsReq)(nil), // 1: frontend.product.SearchProductsReq\n\t(*common.Empty)(nil),      // 2: frontend.common.Empty\n}\nvar file_product_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.product.ProductService.GetProduct:input_type -> frontend.product.ProductReq\n\t1, // 1: frontend.product.ProductService.SearchProducts:input_type -> frontend.product.SearchProductsReq\n\t2, // 2: frontend.product.ProductService.GetProduct:output_type -> frontend.common.Empty\n\t2, // 3: frontend.product.ProductService.SearchProducts:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_product_page_proto_init() }\nfunc file_product_page_proto_init() {\n\tif File_product_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_page_proto_goTypes,\n\t\tDependencyIndexes: file_product_page_proto_depIdxs,\n\t\tMessageInfos:      file_product_page_proto_msgTypes,\n\t}.Build()\n\tFile_product_page_proto = out.File\n\tfile_product_page_proto_rawDesc = nil\n\tfile_product_page_proto_goTypes = nil\n\tfile_product_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tUserClient    userservice.Client\n\tProductClient productcatalogservice.Client\n\tCartClient    cartservice.Client\n\tonce          sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitUserClient()\n\t\tinitProductClient()\n\t\tinitCartClient()\n\t})\n}\n\nfunc initUserClient() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\tfrontendutils.MustHandleError(err)\n\tUserClient, err = userservice.NewClient(\"user\", client.WithResolver(r))\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/infra/rpc/client_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\nfunc Test_iniUserClient(t *testing.T) {\n\tinitUserClient()\n\tresp, err := UserClient.Login(context.Background(), &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"jfoajsfoji\",\n\t})\n\tif err != nil {\n\t\tt.Errorf(\"err: %v\", err)\n\t\treturn\n\t}\n\tt.Logf(\"resp: %v\", resp)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzlogrus \"github.com/hertz-contrib/logger/logrus\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\t// init dal\n\t// dal.Init()\n\trpc.InitClient()\n\taddress := conf.GetConf().Hertz.Address\n\th := server.New(server.WithHostPorts(address))\n\n\tregisterMiddleware(h)\n\n\t// add a ping route to test\n\th.GET(\"/ping\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.JSON(consts.StatusOK, utils.H{\"ping\": \"pong\"})\n\t})\n\n\trouter.GeneratedRegister(h)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Static(\"/static\", \"./\")\n\n\th.GET(\"/about\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"about\", utils.H{\"title\": \"About\"})\n\t})\n\n\th.GET(\"/sign-in\", func(c context.Context, ctx *app.RequestContext) {\n\t\tdata := utils.H{\n\t\t\t\"title\": \"Sign In\",\n\t\t\t\"next\":  ctx.Query(\"next\"),\n\t\t}\n\t\tctx.HTML(consts.StatusOK, \"sign-in\", data)\n\t})\n\th.GET(\"/sign-up\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"sign-up\", utils.H{\"title\": \"Sign Up\"})\n\t})\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\tstore, err := redis.NewStore(10, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\n\t// log\n\tlogger := hertzlogrus.NewLogger()\n\thlog.SetLogger(logger)\n\thlog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Hertz.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Hertz.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Hertz.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Hertz.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\thlog.SetOutput(asyncWriter)\n\th.OnShutdown = append(h.OnShutdown, func(ctx context.Context) {\n\t\tasyncWriter.Sync()\n\t})\n\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\t// cores\n\th.Use(cors.Default())\n\n\tmiddleware.Register(h)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tctx = context.WithValue(ctx, frontendUtils.SessionUserId, s.Get(\"user_id\"))\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tuserId := s.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Redirect(302, []byte(\"/sign-in?next=\"+c.FullPath()))\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc Register(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/about.tmpl",
    "content": "{{define \"about\"}}\n{{template \"header\" .}}\n  <div>\n    <img src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" class=\"col-lg-2 col-md-3 col-sm-4\"/>\n    <p>This is community a driven project.</p>\n  </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/cart-num.tmpl",
    "content": "{{define \"cart-num\"}}\n    <a href=\"/cart\" class=\"btn position-relative\">\n        <i class=\"fa-solid fa-cart-shopping fa-xl\">\n        </i>\n        {{ if $.cart_num}}\n        <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\">\n    {{ $.cart_num }}\n            {{ end }}\n  </span>\n    </a>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/cart.tmpl",
    "content": "{{ define \"cart\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <ul class=\"list-group\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n        {{ if $.items }}\n            <div class=\"mt-3 mb-5\">\n                <div class=\"float-end\">\n                    <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                    <a href=\"/checkout\" class=\"btn btn-lg btn-success float-end\">Check out</a>\n                </div>\n            </div>\n        {{else}}\n            <h1 class=\"text-center text-danger\">Your Cart is empty</h1>\n            <div class=\"text-center\"><a href=\"/\">Shop Hot Sale</a></div>\n        {{ end }}\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/category.tmpl",
    "content": "{{ define \"category\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/footer.tmpl",
    "content": "{{define \"footer\"}}\n</div>\n</main>\n  <footer>\n    <div class=\"text-bg-primary py-5 text-center\">\n      <p>&copy; 2024 <a href=\"https://github.com/cloudwego\" class=\"text-reset\">CloudWeGo</a></p>\n    </div>\n  </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\" integrity=\"sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz\" crossorigin=\"anonymous\"></script>\n  </body>\n</html>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/header.tmpl",
    "content": "{{define \"header\"}}\n<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>CloudWeGo Shop</title>\n    <link href=\"/static/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n            integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n</head>\n<body class=\"min-vh-100\">\n<header>\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container\">\n        <img class=\"navbar-brand\" href=\"#\" src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" style=\"height: 3em;\"/>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n        </button>\n        <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n            <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"/\">CloudWeGo Shop</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Categories\n            </a>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"/category/t-shirt\">T-shirt</a></li>\n                <li><a class=\"dropdown-item\" href=\"/category/sticker\">Sticker</a></li>\n            </ul>\n            </li>\n            <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"/about\" >About</a>\n            </li>\n        </ul>\n        <form class=\"d-flex ms-auto\" role=\"search\" action=\"/search\" method=\"get\">\n            <input class=\"form-control me-2\" type=\"search\" name=\"q\" placeholder=\"Search\"\n                   aria-label=\"Search\" value=\"{{ .q }}\">\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n\n        {{ template \"cart-num\" . }}\n\n        {{ if .user_id }}\n        <div class=\"dropdown\">\n            <div class=\"ms-3 dropdown-toggle\" data-bs-toggle=\"dropdown\">\n                <i class=\"fa-solid fa-user fa-lg\"></i>\n                <span>Hello</span>\n            </div>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Order Center</a></li>\n                <li>\n                    <form action=\"/auth/logout\" method=\"post\">\n                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                    </form>\n                </li>\n            </ul>\n        </div>\n        {{ else }}\n        <div class=\"ms-3\">\n        <a type=\"button\" class=\"btn btn-primary\" href=\"/sign-in\">Sign In</a>\n        </div>\n        {{ end }}\n        </div>\n    </div>\n    </nav>\n    <div class=\"text-bg-primary text-center\">\n    <p>This Website is hosted for demo purposes only.It is not an actual shop</p>\n    </div>\n</header>\n<main style=\"min-height: calc(80vh);\">\n<div class=\"container-fluid py-3\">\n<h1 class=\"text-center\">{{$.title}}</h1>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/home.tmpl",
    "content": "{{define \"home\"}}\n{{template \"header\" .}}\n    <div class=\"row\">\n      {{range .items}}\n      <div class=\"card col-xl-3 col-lg-4 col-md-6 col-sm-12 p-5 border-0\">\n        <a href=\"/product?id={{ .Id }}\"  class=\"btn\">\n        <img src=\"{{.Picture}}\" class=\"card-img-top\" alt=\"...\">\n        <div class=\"card-body\">\n          <p class=\"card-text\">{{ .Name}}</p>\n          <h5 class=\"card-title\">{{ .Price}}</h5>\n        </div>\n        </a>\n      </div>\n      {{end}}\n    </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/product.tmpl",
    "content": "{{ define \"product\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div id=\"productPicture\" class=\"carousel slide col-lg-6 col-sm-12\">\n                    <div class=\"carousel-indicators\">\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"0\"\n                                class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"1\"\n                                aria-label=\"Slide 2\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"2\"\n                                aria-label=\"Slide 3\"></button>\n                    </div>\n                    <div class=\"carousel-inner\">\n                        <div class=\"carousel-item active\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                    </div>\n                    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"prev\">\n                        <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Previous</span>\n                    </button>\n                    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"next\">\n                        <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Next</span>\n                    </button>\n                </div>\n                <div class=\"col-lg-1\"></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-center\">\n                    <form action=\"/cart\" method=\"post\">\n                        <h5 class=\"card-title\">{{ .item.Name }}</h5>\n                        <p class=\"card-text\">{{ .item.Description }}</p>\n                        <p class=\"card-text\">${{ .item.Price }}</p>\n                        <input type=\"hidden\" value=\"{{ .item.Id }}\" name=\"productId\">\n                        <label for=\"productNum\">数量：</label>\n                        <input type=\"number\" class=\"form-control mt-3\" id=\"productNum\" name=\"productNum\" value=\"1\"\n                               min=\"1\"/>\n                        <input type=\"submit\" class=\"btn btn-primary mt-3\" value=\"Add to Cart\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/required.tmpl",
    "content": "{{ define \"required\" }}\n<span class=\"text-danger\">*</span>\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/search.tmpl",
    "content": "{{ define \"search\" }}\n    {{ template \"header\" . }}\n    {{ if .q }}\n        <div class=\"d-inline-block border border-success rounded-4 p-1 ps-4 pe-4\">\n            <div>\n                {{ .q }}\n                <a href=\"/\" class=\"ps-4\">\n                    <button type=\"button\" class=\"btn btn-sm btn-danger\" aria-label=\"Close\">X</button>\n                </a>\n            </div>\n        </div>\n    {{ end}}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/sign-in.tmpl",
    "content": "{{define \"sign-in\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/login?next={{ .next }}\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign Up</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign In</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/template/sign-up.tmpl",
    "content": "{{define \"sign-up\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password_confirm\" class=\"form-label\">Password Confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password_confirm\" name=\"password_confirm\">\n              </div>\n            <div class=\"mb-3\">\n                Already have a account, click here to <a href=\"/sign-in\">Sign In</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign Up</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\ntype SessionUserIdKey string\n\nconst SessionUserId SessionUserIdKey = \"user_id\"\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) int32 {\n\tuserId := ctx.Value(SessionUserId)\n\tif userId == nil {\n\t\treturn 0\n\t}\n\treturn userId.(int32)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.Product{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Product{},\n\t\t\t&model.Category{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `product`.`category` VALUES (1,'2023-12-06 15:05:06','2023-12-06 15:05:06','T-Shirt','T-Shirt'),(2,'2023-12-06 15:05:06','2023-12-06 15:05:06','Sticker','Sticker')\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product` VALUES ( 1, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Notebook', 'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ', '/static/image/notebook.jpeg', 9.90 ), ( 2, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Mouse-Pad', 'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ', '/static/image/mouse-pad.jpeg', 8.80 ), ( 3, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt.jpeg', 6.60 ), ( 4, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-1.jpeg', 2.20 ), ( 5, '2023-12-06 15:26:19', '2023-12-09 22:32:35', 'Sweatshirt', 'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.', '/static/image/sweatshirt.jpeg', 1.10 ), ( 6, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-2.jpeg', 1.80 ), ( 7, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'mascot', 'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.', '/static/image/logo.jpg', 4.80 )\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product_category` (product_id,category_id) VALUES ( 1, 2 ), ( 2, 2 ), ( 3, 1 ), ( 4, 1 ), ( 5, 1 ), ( 6, 1 ),( 7, 2 )\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/model/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Category struct {\n\tBase\n\tName        string `json:\"name\"`\n\tDescription string `json:\"description\"`\n\n\tProducts []Product `json:\"product\" gorm:\"many2many:product_category\"`\n}\n\nfunc (c Category) TableName() string {\n\treturn \"category\"\n}\n\ntype CategoryQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (c CategoryQuery) GetProductsByCategoryName(name string) (categories []Category, err error) {\n\terr = c.db.WithContext(c.ctx).Model(&Category{}).Where(&Category{Name: name}).Preload(\"Products\").Find(&categories).Error\n\treturn\n}\n\nfunc NewCategoryQuery(ctx context.Context, db *gorm.DB) *CategoryQuery {\n\treturn &CategoryQuery{\n\t\tctx: ctx,\n\t\tdb:  db,\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/model/product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tBase\n\tName        string  `json:\"name\"`\n\tDescription string  `json:\"description\"`\n\tPicture     string  `json:\"picture\"`\n\tPrice       float32 `json:\"price\"`\n\n\tCategories []Category `json:\"categories\" gorm:\"many2many:product_category\"`\n}\n\nfunc (p Product) TableName() string {\n\treturn \"product\"\n}\n\ntype ProductQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (p ProductQuery) GetById(productId int) (product Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).First(&product, productId).Error\n\treturn\n}\n\nfunc (p ProductQuery) SearchProducts(q string) (products []*Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).Find(&products, \"name like ? or description like ?\",\n\t\t\"%\"+q+\"%\", \"%\"+q+\"%\",\n\t).Error\n\treturn\n}\n\nfunc NewProductQuery(ctx context.Context, db *gorm.DB) *ProductQuery {\n\treturn &ProductQuery{\n\t\tctx: ctx,\n\t\tdb:  db,\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetProductService struct {\n\tctx context.Context\n} // NewGetProductService new GetProductService\nfunc NewGetProductService(ctx context.Context) *GetProductService {\n\treturn &GetProductService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetProductService) Run(req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tif req.Id == 0 {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(2004001, \"product id is required\")\n\t}\n\tproductQuery := model.NewProductQuery(s.ctx, mysql.DB)\n\n\tp, err := productQuery.GetById(int(req.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &product.GetProductResp{\n\t\tProduct: &product.Product{\n\t\t\tId:          uint32(p.ID),\n\t\t\tPicture:     p.Picture,\n\t\t\tPrice:       p.Price,\n\t\t\tDescription: p.Description,\n\t\t\tName:        p.Name,\n\t\t},\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/service/get_product_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\nfunc TestGetProduct_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewGetProductService(ctx)\n\t// init req and assert value\n\n\treq := &product.GetProductReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/service/list_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype ListProductsService struct {\n\tctx context.Context\n} // NewListProductsService new ListProductsService\nfunc NewListProductsService(ctx context.Context) *ListProductsService {\n\treturn &ListProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListProductsService) Run(req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\t// Finish your business logic.\n\tcategoryQuery := model.NewCategoryQuery(s.ctx, mysql.DB)\n\n\tc, err := categoryQuery.GetProductsByCategoryName(req.CategoryName)\n\tresp = &product.ListProductsResp{}\n\tfor _, v1 := range c {\n\t\tfor _, v := range v1.Products {\n\t\t\tresp.Products = append(resp.Products, &product.Product{\n\t\t\t\tId:          uint32(v.ID),\n\t\t\t\tName:        v.Name,\n\t\t\t\tDescription: v.Description,\n\t\t\t\tPicture:     v.Picture,\n\t\t\t\tPrice:       v.Price,\n\t\t\t})\n\t\t}\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/service/list_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\nfunc TestListProducts_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewListProductsService(ctx)\n\t// init req and assert value\n\n\treq := &product.ListProductsReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype SearchProductsService struct {\n\tctx context.Context\n} // NewSearchProductsService new SearchProductsService\nfunc NewSearchProductsService(ctx context.Context) *SearchProductsService {\n\treturn &SearchProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SearchProductsService) Run(req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\t// Finish your business logic.\n\tproductQuery := model.NewProductQuery(s.ctx, mysql.DB)\n\tproducts, err := productQuery.SearchProducts(req.Query)\n\tvar results []*product.Product\n\tfor _, v := range products {\n\t\tresults = append(results, &product.Product{\n\t\t\tId:          uint32(v.ID),\n\t\t\tName:        v.Name,\n\t\t\tDescription: v.Description,\n\t\t\tPicture:     v.Picture,\n\t\t\tPrice:       v.Price,\n\t\t})\n\t}\n\n\treturn &product.SearchProductsResp{Results: results}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/biz/service/search_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\nfunc TestSearchProducts_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewSearchProductsService(ctx)\n\t// init req and assert value\n\n\treq := &product.SearchProductsReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"product\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/product\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.2\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca h1:TE5KFwos5Gxn1IHdwW05E98wZ/nM9efZe12D8h5eunA=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca/go.mod h1:0miM9JonVZc9rPFBnCJpeoPiANNzT9ZfbJR3hDlXu14=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638 h1:b7mQxlMUT7APPFecvzetyPC8fJCVOOnd0zMspF7jqwc=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.2 h1:L0L3fcSNReTRGyZ6AqAEN0K56wYeYAwapBIhkvh0f3E=\ngithub.com/redis/go-redis/v9 v9.5.2/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/service\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\n// ProductCatalogServiceImpl implements the last service interface defined in the IDL.\ntype ProductCatalogServiceImpl struct{}\n\n// ListProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) ListProducts(ctx context.Context, req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\tresp, err = service.NewListProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetProduct implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) GetProduct(ctx context.Context, req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tresp, err = service.NewGetProductService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// SearchProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) SearchProducts(ctx context.Context, req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\tresp, err = service.NewSearchProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'product'\n  ToolVersion: 'v0.9.0'\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := productcatalogservice.NewServer(new(ProductCatalogServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}), server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/product\"\nexec \"$CURDIR/bin/product\"\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/script/product.sql",
    "content": "CREATE TABLE `category`\n(\n    `id`          int          NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)  NOT NULL,\n    `description` varchar(255) NOT NULL,\n    `created_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `category`\nVALUES (1, 'Clothes', 'Clothes', '2023-12-06 15:05:06', '2023-12-06 15:05:06'),\n       (2, 'Other', 'Other', '2023-12-06 15:05:06', '2023-12-06 15:05:06');\nCREATE TABLE `product`\n(\n    `id`          int            NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)    NOT NULL,\n    `description` varchar(255)   NOT NULL,\n    `picture`     varchar(255)   NOT NULL,\n    `price`       decimal(10, 2) NOT NULL,\n    `created_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product`\nVALUES (1, 'Notebook',\n        'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ',\n        '/static/image/notebook.jpeg', 9.90, '2023-12-06 15:26:19', '2023-12-09 22:29:10'),\n       (2, 'Mouse-Pad',\n        'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ',\n        '/static/image/mouse-pad.jpeg', 8.80, '2023-12-06 15:26:19', '2023-12-09 22:29:59'),\n       (3, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt.jpeg', 6.60, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (4, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-1.jpeg', 2.20, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (5, 'Sweatshirt',\n        'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.',\n        '/static/image/sweatshirt.jpeg', 1.10, '2023-12-06 15:26:19', '2023-12-09 22:32:35'),\n       (6, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-2.jpeg', 1.80, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (10, 'mascot',\n        'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.',\n        '/static/image/logo.jpg', 4.80, '2023-12-06 15:26:19', '2023-12-09 22:39:47');\nCREATE TABLE `product_category`\n(\n    `id`          int      NOT NULL AUTO_INCREMENT,\n    `product_id`  int      NOT NULL,\n    `category_id` int      NOT NULL,\n    `created_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product_category`\nVALUES (1, 1, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (2, 2, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (3, 3, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (4, 4, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (5, 5, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (6, 6, 1, '2023-12-06 15:27:30', '2023-12-09 22:41:47'),\n       (10, 10, 2, '2023-12-06 15:27:30', '2023-12-06 15:27:30');"
  },
  {
    "path": "gomall/tutorial/ch11/app/product/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"shop-product\"\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif conf.GetConf().Env != \"online\" {\n\t\terr = DB.AutoMigrate(&model.User{})\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tgorm.Model\n\tEmail          string `gorm:\"uniqueIndex;type:varchar(255) not null\"`\n\tPasswordHashed string `gorm:\"type:varchar(255) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n\nfunc Create(ctx context.Context, db *gorm.DB, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n\nfunc GetByEmail(ctx context.Context, db *gorm.DB, email string) (*User, error) {\n\tvar user User\n\terr := db.WithContext(ctx).Where(\"email = ?\", email).First(&user).Error\n\treturn &user, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\trow, err := model.GetByEmail(s.ctx, mysql.DB, req.Email)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(row.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &user.LoginResp{\n\t\tUserId: int32(row.ID),\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewLoginService(ctx)\n\t// init req and assert value\n\n\treq := &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" || req.PasswordConfirm == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\tif req.Password != req.PasswordConfirm {\n\t\treturn nil, errors.New(\"password not match\")\n\t}\n\tpasswordHashed, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(passwordHashed),\n\t}\n\terr = model.Create(s.ctx, mysql.DB, newUser)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewRegisterService(ctx)\n\t// init req and assert value\n\n\treq := &user.RegisterReq{\n\t\tEmail:           \"1demo@damin.com\",\n\t\tPassword:        \"FJODIAFUFJO\",\n\t\tPasswordConfirm: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.9.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.34.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch11/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/tutorial/ch11/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/tutorial/ch11/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(&model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/biz/dal/redis/init.go",
    "content": "package redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"uniqueIndex;type:varchar(128) not null\"`\n\tPassword string `gorm:\"type:varchar(64) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\t// CURD\n\n\t// Create\n\t// mysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"jfiojffjsoij\"})\n\n\t// Update\n\t// mysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").Update(\"password\", \"22222222\")\n\n\t// Read\n\tvar row model.User\n\tmysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").First(&row)\n\n\tfmt.Printf(\"row: %+v\\n\", row)\n\n\t// Delete\n\t// mysql.DB.Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n\n\t// mysql.DB.Unscoped().Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch11/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch11/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n      - MYSQL_DATABASE=demo_proto\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: \"redis:latest\"\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch11/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/cart\n\t./app/frontend\n\t./app/product\n\t./app/user\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch11/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch11/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch11/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n    optional string raw_body = 50101;\n    optional string query = 50102;\n    optional string header = 50103;\n    optional string cookie = 50104;\n    optional string body = 50105;\n    optional string path = 50106;\n    optional string vd = 50107;\n    optional string form = 50108;\n    optional string js_conv = 50109;\n    optional string file_name = 50110;\n    optional string none = 50111;\n\n    // 50131~50160 used to extend field option by hz\n    optional string form_compatible = 50131;\n    optional string js_conv_compatible = 50132;\n    optional string file_name_compatible = 50133;\n    optional string none_compatible = 50134;\n    // 50135 is reserved to vt_compatible\n    // optional FieldRules vt_compatible = 50135;\n\n    optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n    optional string get = 50201;\n    optional string post = 50202;\n    optional string put = 50203;\n    optional string delete = 50204;\n    optional string patch = 50205;\n    optional string options = 50206;\n    optional string head = 50207;\n    optional string any = 50208;\n    optional string gen_path = 50301; // The path specified by the user when the client code is generated, with a higher priority than api_version\n    optional string api_version = 50302; // Specify the value of the :version variable in path when the client code is generated\n    optional string tag = 50303; // rpc tag, can be multiple, separated by commas\n    optional string name = 50304; // Name of rpc\n    optional string api_level = 50305; // Interface Level\n    optional string serializer = 50306; // Serialization method\n    optional string param = 50307; // Whether client requests take public parameters\n    optional string baseurl = 50308; // Baseurl used in ttnet routing\n    optional string handler_path = 50309; // handler_path specifies the path to generate the method\n\n    // 50331~50360 used to extend method option by hz\n    optional string handler_path_compatible = 50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n    optional int32 http_code = 50401;\n\n// 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n    optional string base_domain = 50402;\n\n    // 50731~50760 used to extend service option by hz\n    optional string base_domain_compatible = 50731;\n}\n\nextend google.protobuf.MessageOptions {\n    // optional FieldRules msg_vt = 50111;\n\n    optional string reserve = 50830;\n    // 550831 is reserved to msg_vt_compatible\n    // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/idl/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart;\n\noption go_package = \"/cart\";\n\nservice CartService {\n  rpc AddItem (AddItemReq) returns (AddItemResp) {}\n  rpc GetCart (GetCartReq) returns (GetCartResp) {}\n  rpc EmptyCart (EmptyCartReq) returns (EmptyCartResp) {}\n}\n\nmessage CartItem {\n    uint32 product_id = 1;\n    uint32 quantity = 2;\n}\n\nmessage AddItemReq {\n    uint32 user_id = 1;\n    CartItem item = 2;\n}\n\nmessage AddItemResp {}\n\nmessage GetCartReq {\n    uint32 user_id = 1;\n}\n\nmessage GetCartResp {\n    repeated CartItem items = 1;\n}\n\nmessage EmptyCartReq {\n    uint32 user_id = 1;\n}\n\nmessage EmptyCartResp {}"
  },
  {
    "path": "gomall/tutorial/ch11/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch11/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch11/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/auth\";\n\nmessage LoginReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string next = 3 [(api.query)=\"next\"];\n}\n\nmessage RegisterReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string password_confirm = 3 [(api.form)=\"password_confirm\"];\n}\n\nservice AuthService {\n   rpc login(LoginReq) returns(common.Empty) {\n      option (api.post) = \"/auth/login\";\n   }\n   rpc register(RegisterReq) returns(common.Empty) {\n    option (api.post) = \"/auth/register\";\n }\n rpc logout(common.Empty) returns(common.Empty) {\n    option (api.post) = \"/auth/logout\";\n }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/idl/frontend/cart_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.cart;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/cart\";\n\nservice CartService {\n    rpc AddCartItem(AddCartItemReq) returns (common.Empty) {\n        option (api.post) = \"/cart\";\n    }\n    rpc GetCart(common.Empty) returns (common.Empty) {\n        option (api.get) = \"/cart\";\n    }\n}\n\nmessage AddCartItemReq {\n    uint32 product_id = 1 [(api.form) = \"productId\"];\n    int32 product_num = 2 [(api.form) = \"productNum\"];\n}\n\n\n\n\n"
  },
  {
    "path": "gomall/tutorial/ch11/idl/frontend/category_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.category;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/category\";\n\nservice CategoryService {\n    rpc Category(CategoryReq) returns (common.Empty) {\n        option (api.get) = \"/category/:category\";\n    }\n}\n\nmessage CategoryReq {\n    string category = 1 [ (api.path) = \"category\"];\n}\n\n"
  },
  {
    "path": "gomall/tutorial/ch11/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\n\nmessage Empty {}"
  },
  {
    "path": "gomall/tutorial/ch11/idl/frontend/home.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.home;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/home\";\n\nservice HomeService {\n   rpc Home(common.Empty) returns(common.Empty) {\n      option (api.get) = \"/\";\n   }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/idl/frontend/product_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.product;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/product\";\n\nservice ProductService {\n    rpc GetProduct(ProductReq) returns (common.Empty) {\n        option (api.get) = \"/product\";\n    }\n    rpc SearchProducts(SearchProductsReq) returns (common.Empty) {\n        option (api.get) = \"/search\";\n    }\n}\n\nmessage ProductReq {\n    uint32 id = 1 [ (api.query) = \"id\"];\n}\n\nmessage SearchProductsReq {\n    string q = 1 [(api.query) = \"q\"];\n}\n\n"
  },
  {
    "path": "gomall/tutorial/ch11/idl/product.proto",
    "content": "syntax = \"proto3\";\n\npackage product;\n\noption go_package =\"/product\";\n\nservice ProductCatalogService {\n    rpc ListProducts(ListProductsReq) returns (ListProductsResp) {} ;\n    rpc GetProduct(GetProductReq) returns (GetProductResp) {};\n    rpc SearchProducts (SearchProductsReq) returns (SearchProductsResp) {} ;\n}\n\nmessage ListProductsReq {\n    int32 page = 1;\n    int32 page_size = 2;\n    string category_name = 3;\n}\n\nmessage Product {\n    uint32 id = 1;\n    string name = 2;\n    string description = 3;\n    string picture = 4;\n    float price = 5;\n\n    repeated string categories = 6;\n}\n\nmessage ListProductsResp {\n    repeated Product products = 1;\n}\n\nmessage GetProductReq {\n    uint32 id = 1;\n}\n\nmessage GetProductResp {\n    Product product = 1;\n}\n\nmessage SearchProductsReq {\n    string query = 1;\n}\n\nmessage SearchProductsResp {\n    repeated Product results = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/idl/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"/user\";\n\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string password_confirm = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email = 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n\nservice UserService {\n  rpc Register (RegisterReq) returns (RegisterResp) {}\n  rpc Login (LoginReq) returns (LoginResp) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgoogle.golang.org/protobuf v1.34.1\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.8.2 // indirect\n\tgithub.com/tidwall/gjson v1.9.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/cart/cart.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CartItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CartItem[number], err)\n}\n\nfunc (x *CartItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.ProductId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CartItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Quantity, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_AddItemReq[number], err)\n}\n\nfunc (x *AddItemReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *AddItemResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *GetCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartReq[number], err)\n}\n\nfunc (x *GetCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartResp[number], err)\n}\n\nfunc (x *GetCartResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *EmptyCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmptyCartReq[number], err)\n}\n\nfunc (x *EmptyCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmptyCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *CartItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.ProductId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetProductId())\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Quantity == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 2, x.GetQuantity())\n\treturn offset\n}\n\nfunc (x *AddItemReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItem())\n\treturn offset\n}\n\nfunc (x *AddItemResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *GetCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *EmptyCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *CartItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CartItem) sizeField1() (n int) {\n\tif x.ProductId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetProductId())\n\treturn n\n}\n\nfunc (x *CartItem) sizeField2() (n int) {\n\tif x.Quantity == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(2, x.GetQuantity())\n\treturn n\n}\n\nfunc (x *AddItemReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField2() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetItem())\n\treturn n\n}\n\nfunc (x *AddItemResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nfunc (x *GetCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartResp) sizeField1() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(1, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *EmptyCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *EmptyCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_CartItem = map[int32]string{\n\t1: \"ProductId\",\n\t2: \"Quantity\",\n}\n\nvar fieldIDToName_AddItemReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Item\",\n}\n\nvar fieldIDToName_AddItemResp = map[int32]string{}\n\nvar fieldIDToName_GetCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartResp = map[int32]string{\n\t1: \"Items\",\n}\n\nvar fieldIDToName_EmptyCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_EmptyCartResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/cart/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: cart.proto\n\npackage cart\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\"`\n\tQuantity  uint32 `protobuf:\"varint,2,opt,name=quantity,proto3\" json:\"quantity,omitempty\"`\n}\n\nfunc (x *CartItem) Reset() {\n\t*x = CartItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartItem) ProtoMessage() {}\n\nfunc (x *CartItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartItem.ProtoReflect.Descriptor instead.\nfunc (*CartItem) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartItem) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetQuantity() uint32 {\n\tif x != nil {\n\t\treturn x.Quantity\n\t}\n\treturn 0\n}\n\ntype AddItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32    `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItem   *CartItem `protobuf:\"bytes,2,opt,name=item,proto3\" json:\"item,omitempty\"`\n}\n\nfunc (x *AddItemReq) Reset() {\n\t*x = AddItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemReq) ProtoMessage() {}\n\nfunc (x *AddItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddItemReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *AddItemReq) GetItem() *CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\ntype AddItemResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *AddItemResp) Reset() {\n\t*x = AddItemResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemResp) ProtoMessage() {}\n\nfunc (x *AddItemResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemResp.ProtoReflect.Descriptor instead.\nfunc (*AddItemResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{2}\n}\n\ntype GetCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *GetCartReq) Reset() {\n\t*x = GetCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReq) ProtoMessage() {}\n\nfunc (x *GetCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReq.ProtoReflect.Descriptor instead.\nfunc (*GetCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItems []*CartItem `protobuf:\"bytes,1,rep,name=items,proto3\" json:\"items,omitempty\"`\n}\n\nfunc (x *GetCartResp) Reset() {\n\t*x = GetCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartResp) ProtoMessage() {}\n\nfunc (x *GetCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartResp.ProtoReflect.Descriptor instead.\nfunc (*GetCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetCartResp) GetItems() []*CartItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\ntype EmptyCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *EmptyCartReq) Reset() {\n\t*x = EmptyCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartReq) ProtoMessage() {}\n\nfunc (x *EmptyCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartReq.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *EmptyCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype EmptyCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmptyCartResp) Reset() {\n\t*x = EmptyCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartResp) ProtoMessage() {}\n\nfunc (x *EmptyCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartResp.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{6}\n}\n\nvar File_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x08, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0a, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04,\n\t0x69, 0x74, 0x65, 0x6d, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x25, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65,\n\t0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0b, 0x47, 0x65,\n\t0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x24, 0x0a, 0x05, 0x69, 0x74, 0x65,\n\t0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22,\n\t0x27, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12,\n\t0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,\n\t0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x0f, 0x0a, 0x0d, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x32, 0xa9, 0x01, 0x0a, 0x0b, 0x43, 0x61,\n\t0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49,\n\t0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64,\n\t0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x07, 0x47,\n\t0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x47, 0x65,\n\t0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36, 0x0a,\n\t0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x12, 0x12, 0x2e, 0x63, 0x61, 0x72,\n\t0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x13,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69,\n\t0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70,\n\t0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f,\n\t0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_proto_rawDescOnce sync.Once\n\tfile_cart_proto_rawDescData = file_cart_proto_rawDesc\n)\n\nfunc file_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_proto_rawDescData)\n\t})\n\treturn file_cart_proto_rawDescData\n}\n\nvar file_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_cart_proto_goTypes = []interface{}{\n\t(*CartItem)(nil),      // 0: cart.CartItem\n\t(*AddItemReq)(nil),    // 1: cart.AddItemReq\n\t(*AddItemResp)(nil),   // 2: cart.AddItemResp\n\t(*GetCartReq)(nil),    // 3: cart.GetCartReq\n\t(*GetCartResp)(nil),   // 4: cart.GetCartResp\n\t(*EmptyCartReq)(nil),  // 5: cart.EmptyCartReq\n\t(*EmptyCartResp)(nil), // 6: cart.EmptyCartResp\n}\nvar file_cart_proto_depIdxs = []int32{\n\t0, // 0: cart.AddItemReq.item:type_name -> cart.CartItem\n\t0, // 1: cart.GetCartResp.items:type_name -> cart.CartItem\n\t1, // 2: cart.CartService.AddItem:input_type -> cart.AddItemReq\n\t3, // 3: cart.CartService.GetCart:input_type -> cart.GetCartReq\n\t5, // 4: cart.CartService.EmptyCart:input_type -> cart.EmptyCartReq\n\t2, // 5: cart.CartService.AddItem:output_type -> cart.AddItemResp\n\t4, // 6: cart.CartService.GetCart:output_type -> cart.GetCartResp\n\t6, // 7: cart.CartService.EmptyCart:output_type -> cart.EmptyCartResp\n\t5, // [5:8] is the sub-list for method output_type\n\t2, // [2:5] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_proto_init() }\nfunc file_cart_proto_init() {\n\tif File_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_proto = out.File\n\tfile_cart_proto_rawDesc = nil\n\tfile_cart_proto_goTypes = nil\n\tfile_cart_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CartService interface {\n\tAddItem(ctx context.Context, req *AddItemReq) (res *AddItemResp, err error)\n\tGetCart(ctx context.Context, req *GetCartReq) (res *GetCartResp, err error)\n\tEmptyCart(ctx context.Context, req *EmptyCartReq) (res *EmptyCartResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/cart/cartservice/cartservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfo\n}\n\nvar cartServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CartService\"\n\thandlerType := (*cart.CartService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"AddItem\":   kitex.NewMethodInfo(addItemHandler, newAddItemArgs, newAddItemResult, false),\n\t\t\"GetCart\":   kitex.NewMethodInfo(getCartHandler, newGetCartArgs, newGetCartResult, false),\n\t\t\"EmptyCart\": kitex.NewMethodInfo(emptyCartHandler, newEmptyCartArgs, newEmptyCartResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"cart\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc addItemHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.AddItemReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).AddItem(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *AddItemArgs:\n\t\tsuccess, err := handler.(cart.CartService).AddItem(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*AddItemResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newAddItemArgs() interface{} {\n\treturn &AddItemArgs{}\n}\n\nfunc newAddItemResult() interface{} {\n\treturn &AddItemResult{}\n}\n\ntype AddItemArgs struct {\n\tReq *cart.AddItemReq\n}\n\nfunc (p *AddItemArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.AddItemReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *AddItemArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *AddItemArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *AddItemArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar AddItemArgs_Req_DEFAULT *cart.AddItemReq\n\nfunc (p *AddItemArgs) GetReq() *cart.AddItemReq {\n\tif !p.IsSetReq() {\n\t\treturn AddItemArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *AddItemArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *AddItemArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype AddItemResult struct {\n\tSuccess *cart.AddItemResp\n}\n\nvar AddItemResult_Success_DEFAULT *cart.AddItemResp\n\nfunc (p *AddItemResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.AddItemResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *AddItemResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *AddItemResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *AddItemResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *AddItemResult) GetSuccess() *cart.AddItemResp {\n\tif !p.IsSetSuccess() {\n\t\treturn AddItemResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *AddItemResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.AddItemResp)\n}\n\nfunc (p *AddItemResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *AddItemResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.GetCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).GetCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).GetCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetCartArgs() interface{} {\n\treturn &GetCartArgs{}\n}\n\nfunc newGetCartResult() interface{} {\n\treturn &GetCartResult{}\n}\n\ntype GetCartArgs struct {\n\tReq *cart.GetCartReq\n}\n\nfunc (p *GetCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.GetCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetCartArgs_Req_DEFAULT *cart.GetCartReq\n\nfunc (p *GetCartArgs) GetReq() *cart.GetCartReq {\n\tif !p.IsSetReq() {\n\t\treturn GetCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetCartResult struct {\n\tSuccess *cart.GetCartResp\n}\n\nvar GetCartResult_Success_DEFAULT *cart.GetCartResp\n\nfunc (p *GetCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.GetCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetCartResult) GetSuccess() *cart.GetCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.GetCartResp)\n}\n\nfunc (p *GetCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc emptyCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.EmptyCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).EmptyCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EmptyCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).EmptyCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EmptyCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEmptyCartArgs() interface{} {\n\treturn &EmptyCartArgs{}\n}\n\nfunc newEmptyCartResult() interface{} {\n\treturn &EmptyCartResult{}\n}\n\ntype EmptyCartArgs struct {\n\tReq *cart.EmptyCartReq\n}\n\nfunc (p *EmptyCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.EmptyCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EmptyCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EmptyCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EmptyCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EmptyCartArgs_Req_DEFAULT *cart.EmptyCartReq\n\nfunc (p *EmptyCartArgs) GetReq() *cart.EmptyCartReq {\n\tif !p.IsSetReq() {\n\t\treturn EmptyCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EmptyCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EmptyCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EmptyCartResult struct {\n\tSuccess *cart.EmptyCartResp\n}\n\nvar EmptyCartResult_Success_DEFAULT *cart.EmptyCartResp\n\nfunc (p *EmptyCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.EmptyCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EmptyCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EmptyCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EmptyCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EmptyCartResult) GetSuccess() *cart.EmptyCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn EmptyCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EmptyCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.EmptyCartResp)\n}\n\nfunc (p *EmptyCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EmptyCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) AddItem(ctx context.Context, Req *cart.AddItemReq) (r *cart.AddItemResp, err error) {\n\tvar _args AddItemArgs\n\t_args.Req = Req\n\tvar _result AddItemResult\n\tif err = p.c.Call(ctx, \"AddItem\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetCart(ctx context.Context, Req *cart.GetCartReq) (r *cart.GetCartResp, err error) {\n\tvar _args GetCartArgs\n\t_args.Req = Req\n\tvar _result GetCartResult\n\tif err = p.c.Call(ctx, \"GetCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq) (r *cart.EmptyCartResp, err error) {\n\tvar _args EmptyCartArgs\n\t_args.Req = Req\n\tvar _result EmptyCartResult\n\tif err = p.c.Call(ctx, \"EmptyCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/cart/cartservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCartServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCartServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCartServiceClient) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.AddItem(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetCart(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.EmptyCart(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/cart/cartservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler cart.CartService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/cart/cartservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler cart.CartService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/product/product.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *ListProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsReq[number], err)\n}\n\nfunc (x *ListProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Page, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.PageSize, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CategoryName, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Product[number], err)\n}\n\nfunc (x *Product) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Name, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Description, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Picture, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Price, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v string\n\tv, offset, err = fastpb.ReadString(buf, _type)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Categories = append(x.Categories, v)\n\treturn offset, err\n}\n\nfunc (x *ListProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsResp[number], err)\n}\n\nfunc (x *ListProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Products = append(x.Products, &v)\n\treturn offset, nil\n}\n\nfunc (x *GetProductReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductReq[number], err)\n}\n\nfunc (x *GetProductReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetProductResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductResp[number], err)\n}\n\nfunc (x *GetProductResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Product = &v\n\treturn offset, nil\n}\n\nfunc (x *SearchProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsReq[number], err)\n}\n\nfunc (x *SearchProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Query, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *SearchProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsResp[number], err)\n}\n\nfunc (x *SearchProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Results = append(x.Results, &v)\n\treturn offset, nil\n}\n\nfunc (x *ListProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Page == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetPage())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.PageSize == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetPageSize())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.CategoryName == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetCategoryName())\n\treturn offset\n}\n\nfunc (x *Product) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField2(buf []byte) (offset int) {\n\tif x.Name == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetName())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField3(buf []byte) (offset int) {\n\tif x.Description == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetDescription())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField4(buf []byte) (offset int) {\n\tif x.Picture == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetPicture())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField5(buf []byte) (offset int) {\n\tif x.Price == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 5, x.GetPrice())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField6(buf []byte) (offset int) {\n\tif len(x.Categories) == 0 {\n\t\treturn offset\n\t}\n\tfor i := range x.GetCategories() {\n\t\toffset += fastpb.WriteString(buf[offset:], 6, x.GetCategories()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Products == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetProducts() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProducts()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *GetProductReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *GetProductResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Product == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProduct())\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Query == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetQuery())\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Results == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetResults() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetResults()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField1() (n int) {\n\tif x.Page == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetPage())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField2() (n int) {\n\tif x.PageSize == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetPageSize())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField3() (n int) {\n\tif x.CategoryName == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetCategoryName())\n\treturn n\n}\n\nfunc (x *Product) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Product) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *Product) sizeField2() (n int) {\n\tif x.Name == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetName())\n\treturn n\n}\n\nfunc (x *Product) sizeField3() (n int) {\n\tif x.Description == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetDescription())\n\treturn n\n}\n\nfunc (x *Product) sizeField4() (n int) {\n\tif x.Picture == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetPicture())\n\treturn n\n}\n\nfunc (x *Product) sizeField5() (n int) {\n\tif x.Price == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(5, x.GetPrice())\n\treturn n\n}\n\nfunc (x *Product) sizeField6() (n int) {\n\tif len(x.Categories) == 0 {\n\t\treturn n\n\t}\n\tfor i := range x.GetCategories() {\n\t\tn += fastpb.SizeString(6, x.GetCategories()[i])\n\t}\n\treturn n\n}\n\nfunc (x *ListProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListProductsResp) sizeField1() (n int) {\n\tif x.Products == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetProducts() {\n\t\tn += fastpb.SizeMessage(1, x.GetProducts()[i])\n\t}\n\treturn n\n}\n\nfunc (x *GetProductReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductReq) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *GetProductResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductResp) sizeField1() (n int) {\n\tif x.Product == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetProduct())\n\treturn n\n}\n\nfunc (x *SearchProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsReq) sizeField1() (n int) {\n\tif x.Query == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetQuery())\n\treturn n\n}\n\nfunc (x *SearchProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsResp) sizeField1() (n int) {\n\tif x.Results == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetResults() {\n\t\tn += fastpb.SizeMessage(1, x.GetResults()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_ListProductsReq = map[int32]string{\n\t1: \"Page\",\n\t2: \"PageSize\",\n\t3: \"CategoryName\",\n}\n\nvar fieldIDToName_Product = map[int32]string{\n\t1: \"Id\",\n\t2: \"Name\",\n\t3: \"Description\",\n\t4: \"Picture\",\n\t5: \"Price\",\n\t6: \"Categories\",\n}\n\nvar fieldIDToName_ListProductsResp = map[int32]string{\n\t1: \"Products\",\n}\n\nvar fieldIDToName_GetProductReq = map[int32]string{\n\t1: \"Id\",\n}\n\nvar fieldIDToName_GetProductResp = map[int32]string{\n\t1: \"Product\",\n}\n\nvar fieldIDToName_SearchProductsReq = map[int32]string{\n\t1: \"Query\",\n}\n\nvar fieldIDToName_SearchProductsResp = map[int32]string{\n\t1: \"Results\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/product/product.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: product.proto\n\npackage product\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPage         int32  `protobuf:\"varint,1,opt,name=page,proto3\" json:\"page,omitempty\"`\n\tPageSize     int32  `protobuf:\"varint,2,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\tCategoryName string `protobuf:\"bytes,3,opt,name=category_name,json=categoryName,proto3\" json:\"category_name,omitempty\"`\n}\n\nfunc (x *ListProductsReq) Reset() {\n\t*x = ListProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsReq) ProtoMessage() {}\n\nfunc (x *ListProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsReq.ProtoReflect.Descriptor instead.\nfunc (*ListProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListProductsReq) GetPage() int32 {\n\tif x != nil {\n\t\treturn x.Page\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetCategoryName() string {\n\tif x != nil {\n\t\treturn x.CategoryName\n\t}\n\treturn \"\"\n}\n\ntype Product struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          uint32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string   `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tPicture     string   `protobuf:\"bytes,4,opt,name=picture,proto3\" json:\"picture,omitempty\"`\n\tPrice       float32  `protobuf:\"fixed32,5,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tCategories  []string `protobuf:\"bytes,6,rep,name=categories,proto3\" json:\"categories,omitempty\"`\n}\n\nfunc (x *Product) Reset() {\n\t*x = Product{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Product) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Product) ProtoMessage() {}\n\nfunc (x *Product) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Product.ProtoReflect.Descriptor instead.\nfunc (*Product) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Product) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPicture() string {\n\tif x != nil {\n\t\treturn x.Picture\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPrice() float32 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetCategories() []string {\n\tif x != nil {\n\t\treturn x.Categories\n\t}\n\treturn nil\n}\n\ntype ListProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProducts []*Product `protobuf:\"bytes,1,rep,name=products,proto3\" json:\"products,omitempty\"`\n}\n\nfunc (x *ListProductsResp) Reset() {\n\t*x = ListProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsResp) ProtoMessage() {}\n\nfunc (x *ListProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsResp.ProtoReflect.Descriptor instead.\nfunc (*ListProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListProductsResp) GetProducts() []*Product {\n\tif x != nil {\n\t\treturn x.Products\n\t}\n\treturn nil\n}\n\ntype GetProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetProductReq) Reset() {\n\t*x = GetProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductReq) ProtoMessage() {}\n\nfunc (x *GetProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductReq.ProtoReflect.Descriptor instead.\nfunc (*GetProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetProductResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProduct *Product `protobuf:\"bytes,1,opt,name=product,proto3\" json:\"product,omitempty\"`\n}\n\nfunc (x *GetProductResp) Reset() {\n\t*x = GetProductResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductResp) ProtoMessage() {}\n\nfunc (x *GetProductResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductResp.ProtoReflect.Descriptor instead.\nfunc (*GetProductResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetProductResp) GetProduct() *Product {\n\tif x != nil {\n\t\treturn x.Product\n\t}\n\treturn nil\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *SearchProductsReq) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\ntype SearchProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*Product `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *SearchProductsResp) Reset() {\n\t*x = SearchProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsResp) ProtoMessage() {}\n\nfunc (x *SearchProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsResp.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SearchProductsResp) GetResults() []*Product {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_product_proto protoreflect.FileDescriptor\n\nvar file_product_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x67, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12,\n\t0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d,\n\t0x65, 0x22, 0x9f, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a,\n\t0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72,\n\t0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65,\n\t0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,\n\t0x69, 0x65, 0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65,\n\t0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22,\n\t0x40, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,\n\t0x73, 0x32, 0xec, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x61, 0x74,\n\t0x61, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x4c,\n\t0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e,\n\t0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73,\n\t0x70, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e,\n\t0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65,\n\t0x71, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72,\n\t0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63,\n\t0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d,\n\t0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_proto_rawDescOnce sync.Once\n\tfile_product_proto_rawDescData = file_product_proto_rawDesc\n)\n\nfunc file_product_proto_rawDescGZIP() []byte {\n\tfile_product_proto_rawDescOnce.Do(func() {\n\t\tfile_product_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_proto_rawDescData)\n\t})\n\treturn file_product_proto_rawDescData\n}\n\nvar file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_product_proto_goTypes = []interface{}{\n\t(*ListProductsReq)(nil),    // 0: product.ListProductsReq\n\t(*Product)(nil),            // 1: product.Product\n\t(*ListProductsResp)(nil),   // 2: product.ListProductsResp\n\t(*GetProductReq)(nil),      // 3: product.GetProductReq\n\t(*GetProductResp)(nil),     // 4: product.GetProductResp\n\t(*SearchProductsReq)(nil),  // 5: product.SearchProductsReq\n\t(*SearchProductsResp)(nil), // 6: product.SearchProductsResp\n}\nvar file_product_proto_depIdxs = []int32{\n\t1, // 0: product.ListProductsResp.products:type_name -> product.Product\n\t1, // 1: product.GetProductResp.product:type_name -> product.Product\n\t1, // 2: product.SearchProductsResp.results:type_name -> product.Product\n\t0, // 3: product.ProductCatalogService.ListProducts:input_type -> product.ListProductsReq\n\t3, // 4: product.ProductCatalogService.GetProduct:input_type -> product.GetProductReq\n\t5, // 5: product.ProductCatalogService.SearchProducts:input_type -> product.SearchProductsReq\n\t2, // 6: product.ProductCatalogService.ListProducts:output_type -> product.ListProductsResp\n\t4, // 7: product.ProductCatalogService.GetProduct:output_type -> product.GetProductResp\n\t6, // 8: product.ProductCatalogService.SearchProducts:output_type -> product.SearchProductsResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_product_proto_init() }\nfunc file_product_proto_init() {\n\tif File_product_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Product); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_proto_goTypes,\n\t\tDependencyIndexes: file_product_proto_depIdxs,\n\t\tMessageInfos:      file_product_proto_msgTypes,\n\t}.Build()\n\tFile_product_proto = out.File\n\tfile_product_proto_rawDesc = nil\n\tfile_product_proto_goTypes = nil\n\tfile_product_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\ntype ProductCatalogService interface {\n\tListProducts(ctx context.Context, req *ListProductsReq) (res *ListProductsResp, err error)\n\tGetProduct(ctx context.Context, req *GetProductReq) (res *GetProductResp, err error)\n\tSearchProducts(ctx context.Context, req *SearchProductsReq) (res *SearchProductsResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/product/productcatalogservice/client.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductCatalogServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductCatalogServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductCatalogServiceClient) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.SearchProducts(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/product/productcatalogservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductCatalogService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/product/productcatalogservice/productcatalogservice.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"ListProducts\": kitex.NewMethodInfo(\n\t\tlistProductsHandler,\n\t\tnewListProductsArgs,\n\t\tnewListProductsResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"GetProduct\": kitex.NewMethodInfo(\n\t\tgetProductHandler,\n\t\tnewGetProductArgs,\n\t\tnewGetProductResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"SearchProducts\": kitex.NewMethodInfo(\n\t\tsearchProductsHandler,\n\t\tnewSearchProductsArgs,\n\t\tnewSearchProductsResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tproductCatalogServiceServiceInfo                = NewServiceInfo()\n\tproductCatalogServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tproductCatalogServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"ProductCatalogService\"\n\thandlerType := (*product.ProductCatalogService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"product\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.ListProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).ListProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *ListProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).ListProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListProductsResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newListProductsArgs() interface{} {\n\treturn &ListProductsArgs{}\n}\n\nfunc newListProductsResult() interface{} {\n\treturn &ListProductsResult{}\n}\n\ntype ListProductsArgs struct {\n\tReq *product.ListProductsReq\n}\n\nfunc (p *ListProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.ListProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListProductsArgs_Req_DEFAULT *product.ListProductsReq\n\nfunc (p *ListProductsArgs) GetReq() *product.ListProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn ListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListProductsResult struct {\n\tSuccess *product.ListProductsResp\n}\n\nvar ListProductsResult_Success_DEFAULT *product.ListProductsResp\n\nfunc (p *ListProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.ListProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListProductsResult) GetSuccess() *product.ListProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.ListProductsResp)\n}\n\nfunc (p *ListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.GetProductReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).GetProduct(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *GetProductArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).GetProduct(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetProductResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newGetProductArgs() interface{} {\n\treturn &GetProductArgs{}\n}\n\nfunc newGetProductResult() interface{} {\n\treturn &GetProductResult{}\n}\n\ntype GetProductArgs struct {\n\tReq *product.GetProductReq\n}\n\nfunc (p *GetProductArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.GetProductReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetProductArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetProductArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetProductArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetProductArgs_Req_DEFAULT *product.GetProductReq\n\nfunc (p *GetProductArgs) GetReq() *product.GetProductReq {\n\tif !p.IsSetReq() {\n\t\treturn GetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetProductResult struct {\n\tSuccess *product.GetProductResp\n}\n\nvar GetProductResult_Success_DEFAULT *product.GetProductResp\n\nfunc (p *GetProductResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.GetProductResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetProductResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetProductResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetProductResult) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetProductResult) GetSuccess() *product.GetProductResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.GetProductResp)\n}\n\nfunc (p *GetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc searchProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.SearchProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).SearchProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *SearchProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).SearchProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SearchProductsResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newSearchProductsArgs() interface{} {\n\treturn &SearchProductsArgs{}\n}\n\nfunc newSearchProductsResult() interface{} {\n\treturn &SearchProductsResult{}\n}\n\ntype SearchProductsArgs struct {\n\tReq *product.SearchProductsReq\n}\n\nfunc (p *SearchProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.SearchProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SearchProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SearchProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SearchProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SearchProductsArgs_Req_DEFAULT *product.SearchProductsReq\n\nfunc (p *SearchProductsArgs) GetReq() *product.SearchProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn SearchProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SearchProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SearchProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SearchProductsResult struct {\n\tSuccess *product.SearchProductsResp\n}\n\nvar SearchProductsResult_Success_DEFAULT *product.SearchProductsResp\n\nfunc (p *SearchProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.SearchProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SearchProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SearchProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SearchProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SearchProductsResult) GetSuccess() *product.SearchProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SearchProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SearchProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.SearchProductsResp)\n}\n\nfunc (p *SearchProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SearchProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, Req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args ListProductsArgs\n\t_args.Req = Req\n\tvar _result ListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, Req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args GetProductArgs\n\t_args.Req = Req\n\tvar _result GetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq) (r *product.SearchProductsResp, err error) {\n\tvar _args SearchProductsArgs\n\t_args.Req = Req\n\tvar _result SearchProductsResult\n\tif err = p.c.Call(ctx, \"SearchProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/product/productcatalogservice/server.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductCatalogService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler product.ProductCatalogService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.PasswordConfirm, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetPasswordConfirm())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetPasswordConfirm())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"PasswordConfirm\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Register\": kitex.NewMethodInfo(registerHandler, newRegisterArgs, newRegisterResult, false),\n\t\t\"Login\":    kitex.NewMethodInfo(loginHandler, newLoginArgs, newLoginResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"user\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/rpc/cart/cart_client.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() cartservice.Client\n\tService() string\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := cartservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient cartservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() cartservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\treturn c.kitexClient.AddItem(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\treturn c.kitexClient.GetCart(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\treturn c.kitexClient.EmptyCart(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/rpc/cart/cart_default.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc AddItem(ctx context.Context, req *cart.AddItemReq, callOptions ...callopt.Option) (resp *cart.AddItemResp, err error) {\n\tresp, err = defaultClient.AddItem(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"AddItem call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetCart(ctx context.Context, req *cart.GetCartReq, callOptions ...callopt.Option) (resp *cart.GetCartResp, err error) {\n\tresp, err = defaultClient.GetCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc EmptyCart(ctx context.Context, req *cart.EmptyCartReq, callOptions ...callopt.Option) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = defaultClient.EmptyCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"EmptyCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/rpc/cart/cart_init.go",
    "content": "package cart\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"cart\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/rpc/product/product_client.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() productcatalogservice.Client\n\tService() string\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := productcatalogservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient productcatalogservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() productcatalogservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\treturn c.kitexClient.ListProducts(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\treturn c.kitexClient.GetProduct(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\treturn c.kitexClient.SearchProducts(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/rpc/product/product_default.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (resp *product.ListProductsResp, err error) {\n\tresp, err = defaultClient.ListProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (resp *product.GetProductResp, err error) {\n\tresp, err = defaultClient.GetProduct(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetProduct call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc SearchProducts(ctx context.Context, req *product.SearchProductsReq, callOptions ...callopt.Option) (resp *product.SearchProductsResp, err error) {\n\tresp, err = defaultClient.SearchProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"SearchProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/rpc/product/product_init.go",
    "content": "package product\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"product\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch11/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/.gitignore",
    "content": "app/*/tmp\napp/*/.env\napp/*/log"
  },
  {
    "path": "gomall/tutorial/ch12/Makefile",
    "content": "export ROOT_MOD=github.com/cloudwego/biz-demo/gomall\n.PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module ${ROOT_MOD}/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module  ${ROOT_MOD}/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module ${ROOT_MOD}/app/frontend --idl ../../idl/frontend/checkout_page.proto\n\n.PHONY: gen-user\ngen-user: \n\t@cd rpc_gen && cwgo client --type RPC --service user --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/user.proto\n\t@cd app/user && cwgo server --type RPC --service user --module ${ROOT_MOD}/app/user --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/user.proto\n\n.PHONY: gen-product\ngen-product: \n\t@cd rpc_gen && cwgo client --type RPC --service product --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/product.proto\n\t@cd app/product && cwgo server --type RPC --service product --module ${ROOT_MOD}/app/product --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/product.proto\n\n.PHONY: gen-cart\ngen-cart: \n\t@cd rpc_gen && cwgo client --type RPC --service cart --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/cart.proto\n\t@cd app/cart && cwgo server --type RPC --service cart --module ${ROOT_MOD}/app/cart --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/cart.proto\n\n\n.PHONY: gen-payment\ngen-payment: \n\t@cd rpc_gen && cwgo client --type RPC --service payment --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/payment.proto\n\t@cd app/payment && cwgo server --type RPC --service payment --module ${ROOT_MOD}/app/payment --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/payment.proto\n\n.PHONY: gen-checkout\ngen-checkout: \n\t@cd rpc_gen && cwgo client --type RPC --service checkout --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/checkout.proto\n\t@cd app/checkout && cwgo server --type RPC --service checkout --module ${ROOT_MOD}/app/checkout --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/checkout.proto"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t//redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\terr = DB.AutoMigrate(&model.Cart{})\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/model/cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Cart struct {\n\tgorm.Model\n\tUserId    uint32 `gorm:\"type:int(11);not null;index:idx_user_id\"`\n\tProductId uint32 `gorm:\"type:int(11);not null;\"`\n\tQty       uint32 `gorm:\"type:int(11);not null;\"`\n}\n\nfunc (Cart) TableName() string {\n\treturn \"cart\"\n}\n\nfunc AddItem(ctx context.Context, db *gorm.DB, item *Cart) error {\n\tvar row Cart\n\terr := db.WithContext(ctx).\n\t\tModel(&Cart{}).\n\t\tWhere(&Cart{UserId: item.UserId, ProductId: item.ProductId}).\n\t\tFirst(&row).Error\n\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\treturn err\n\t}\n\tif row.ID > 0 {\n\t\treturn db.WithContext(ctx).\n\t\t\tModel(&Cart{}).\n\t\t\tWhere(&Cart{UserId: item.UserId, ProductId: item.ProductId}).\n\t\t\tUpdateColumn(\"qty\", gorm.Expr(\"qty+?\", item.Qty)).Error\n\t}\n\n\treturn db.WithContext(ctx).Create(item).Error\n}\n\nfunc EmptyCart(ctx context.Context, db *gorm.DB, userId uint32) error {\n\tif userId == 0 {\n\t\treturn errors.New(\"user id is required\")\n\t}\n\treturn db.WithContext(ctx).Delete(&Cart{}, \"user_id = ?\", userId).Error\n}\n\nfunc GetCartByUserId(ctx context.Context, db *gorm.DB, userId uint32) ([]*Cart, error) {\n\tvar rows []*Cart\n\terr := db.WithContext(ctx).\n\t\tModel(&Cart{}).\n\t\tWhere(&Cart{UserId: userId}).\n\t\tFind(&rows).Error\n\treturn rows, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/service/add_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype AddItemService struct {\n\tctx context.Context\n} // NewAddItemService new AddItemService\nfunc NewAddItemService(ctx context.Context) *AddItemService {\n\treturn &AddItemService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *AddItemService) Run(req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\t// Finish your business logic.\n\tproductResp, err := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: req.Item.ProductId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif productResp == nil || productResp.Product.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40004, \"product not found\")\n\t}\n\n\tcartItem := &model.Cart{\n\t\tUserId:    req.UserId,\n\t\tProductId: req.Item.ProductId,\n\t\tQty:       req.Item.Quantity,\n\t}\n\n\terr = model.AddItem(s.ctx, mysql.DB, cartItem)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\n\treturn &cart.AddItemResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/service/add_item_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\nfunc TestAddItem_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewAddItemService(ctx)\n\t// init req and assert value\n\n\treq := &cart.AddItemReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/service/empty_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype EmptyCartService struct {\n\tctx context.Context\n} // NewEmptyCartService new EmptyCartService\nfunc NewEmptyCartService(ctx context.Context) *EmptyCartService {\n\treturn &EmptyCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EmptyCartService) Run(req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\t// Finish your business logic.\n\terr = model.EmptyCart(s.ctx, mysql.DB, req.UserId)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50001, err.Error())\n\t}\n\treturn &cart.EmptyCartResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/service/empty_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\nfunc TestEmptyCart_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEmptyCartService(ctx)\n\t// init req and assert value\n\n\treq := &cart.EmptyCartReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetCartService struct {\n\tctx context.Context\n} // NewGetCartService new GetCartService\nfunc NewGetCartService(ctx context.Context) *GetCartService {\n\treturn &GetCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetCartService) Run(req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\t// Finish your business logic.\n\tlist, err := model.GetCartByUserId(s.ctx, mysql.DB, req.UserId)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50002, err.Error())\n\t}\n\tvar items []*cart.CartItem\n\tfor _, item := range list {\n\t\titems = append(items, &cart.CartItem{\n\t\t\tProductId: item.ProductId,\n\t\t\tQuantity:  item.Qty,\n\t\t})\n\t}\n\treturn &cart.GetCartResp{Items: items}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/biz/service/get_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\nfunc TestGetCart_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewGetCartService(ctx)\n\t// init req and assert value\n\n\treq := &cart.GetCartReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cart\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/cart?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/cart?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/cart?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/cart\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/go-version v1.6.0 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.34.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/service\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\n// CartServiceImpl implements the last service interface defined in the IDL.\ntype CartServiceImpl struct{}\n\n// AddItem implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) AddItem(ctx context.Context, req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\tresp, err = service.NewAddItemService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) GetCart(ctx context.Context, req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\tresp, err = service.NewGetCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// EmptyCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) EmptyCart(ctx context.Context, req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = service.NewEmptyCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\tcartutils \"github.com/cloudwego/biz-demo/gomall/app/cart/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tProductClient productcatalogservice.Client\n\tonce          sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitProductClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcartutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcartutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'cart'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\trpc.InitClient()\n\n\topts := kitexInit()\n\tsvr := cartservice.NewServer(new(CartServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}), server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/cart\"\nexec \"$CURDIR/bin/cart\"\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/cart/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/google/uuid\"\n)\n\ntype CheckoutService struct {\n\tctx context.Context\n} // NewCheckoutService new CheckoutService\nfunc NewCheckoutService(ctx context.Context) *CheckoutService {\n\treturn &CheckoutService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *CheckoutService) Run(req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\t// Finish your business logic.\n\tcartResult, err := rpc.CartClient.GetCart(s.ctx, &cart.GetCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(5005001, err.Error())\n\t}\n\tif cartResult == nil || cartResult.Items == nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(5004001, \"cart is empty\")\n\t}\n\n\tvar total float32\n\n\tfor _, cartItem := range cartResult.Items {\n\t\tproductResp, resultErr := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{\n\t\t\tId: cartItem.ProductId,\n\t\t})\n\n\t\tif resultErr != nil {\n\t\t\treturn nil, resultErr\n\t\t}\n\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tp := productResp.Product.Price\n\n\t\tcost := p * float32(cartItem.Quantity)\n\t\ttotal += cost\n\t}\n\n\tvar orderId string\n\n\tu, _ := uuid.NewRandom()\n\torderId = u.String()\n\n\tpayReq := &payment.ChargeReq{\n\t\tUserId:  req.UserId,\n\t\tOrderId: orderId,\n\t\tAmount:  total,\n\t\tCreditCard: &payment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CreditCard.CreditCardNumber,\n\t\t\tCreditCardCvv:             req.CreditCard.CreditCardCvv,\n\t\t\tCreditCardExpirationMonth: req.CreditCard.CreditCardExpirationMonth,\n\t\t\tCreditCardExpirationYear:  req.CreditCard.CreditCardExpirationYear,\n\t\t},\n\t}\n\n\t_, err = rpc.CartClient.EmptyCart(s.ctx, &cart.EmptyCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n\n\tpaymentResult, err := rpc.PaymentClient.Charge(s.ctx, payReq)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tklog.Info(paymentResult)\n\n\tresp = &checkout.CheckoutResp{\n\t\tOrderId:       orderId,\n\t\tTransactionId: paymentResult.TransactionId,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/biz/service/checkout_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"testing\"\n)\n\nfunc TestCheckout_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewCheckoutService(ctx)\n\t// init req and assert value\n\n\treq := &checkout.CheckoutReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"checkout\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8885\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8885\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8885\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/checkout\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/google/uuid v1.1.2\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.2\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca h1:TE5KFwos5Gxn1IHdwW05E98wZ/nM9efZe12D8h5eunA=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca/go.mod h1:0miM9JonVZc9rPFBnCJpeoPiANNzT9ZfbJR3hDlXu14=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.2 h1:L0L3fcSNReTRGyZ6AqAEN0K56wYeYAwapBIhkvh0f3E=\ngithub.com/redis/go-redis/v9 v9.5.2/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/handler.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/service\"\n)\n\n// CheckoutServiceImpl implements the last service interface defined in the IDL.\ntype CheckoutServiceImpl struct{}\n\n// Checkout implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) Checkout(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tCartClient    cartservice.Client\n\tProductClient productcatalogservice.Client\n\tPaymentClient paymentservice.Client\n\tonce          sync.Once\n\terr           error\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitCartClient()\n\t\tinitProductClient()\n\t\tinitPaymentClient()\n\t})\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initPaymentClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\tPaymentClient, err = paymentservice.NewClient(\"payment\", opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'checkout'\n  ToolVersion: 'v0.9.0'\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\trpc.InitClient()\n\n\tsvr := checkoutservice.NewServer(new(CheckoutServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr), server.WithRegistry(r))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/checkout/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/checkout\"\nexec \"$CURDIR/bin/checkout\"\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(redirect))\n}\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/cart/cart_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetCart .\n// @router /cart [GET]\nfunc GetCart(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetCartService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, resp))\n}\n\n// AddCartItem .\n// @router /cart [POST]\nfunc AddCartItem(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req cart.AddCartItemReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewAddCartItemService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/cart\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/cart/cart_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetCart(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/cart\", GetCart)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestAddCartItem(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/cart\", AddCartItem)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/category/category_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Category .\n// @router /category/:category [GET]\nfunc Category(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req category.CategoryReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewCategoryService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"category\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/category/category_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCategory(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/category/:category\", Category)\n\tpath := \"/category/:category\"                             // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/checkout/checkout_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Checkout .\n// @router /checkout [GET]\nfunc Checkout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutWaiting .\n// @router /checkout/waiting [POST]\nfunc CheckoutWaiting(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutWaitingService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutResult .\n// @router /checkout/result [GET]\nfunc CheckoutResult(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutResultService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"result\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/checkout/checkout_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCheckout(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout\", Checkout)\n\tpath := \"/checkout\"                                       // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutWaiting(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/checkout/waiting\", CheckoutWaiting)\n\tpath := \"/checkout/waiting\"                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutResult(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout/result\", CheckoutResult)\n\tpath := \"/checkout/result\"                                // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/product/product_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetProduct .\n// @router /product [GET]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.ProductReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetProductService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"product\", utils.WarpResponse(ctx, c, resp))\n}\n\n// SearchProducts .\n// @router /search [GET]\nfunc SearchProducts(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.SearchProductsReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewSearchProductsService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"search\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/handler/product/product_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetProduct(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/product\", GetProduct)\n\tpath := \"/product\"                                        // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestSearchProducts(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/search\", SearchProducts)\n\tpath := \"/search\"                                         // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/cart/cart_page.go",
    "content": "// Code generated by hertz generator. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.POST(\"/cart\", append(_addcartitemMw(), cart.AddCartItem)...)\n\troot.GET(\"/cart\", append(_getcartMw(), cart.GetCart)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/cart/middleware.go",
    "content": "// Code generated by hertz generator.\n\npackage cart\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _getcartMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _addcartitemMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/category/category_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage category\n\nimport (\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/category\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_category := root.Group(\"/category\", _categoryMw()...)\n\t\t_category.GET(\"/:category\", append(_category0Mw(), category.Category)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/category/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage category\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _categoryMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _category0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/checkout/checkout_page.go",
    "content": "// Code generated by hertz generator. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/checkout\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/checkout\", append(_checkout0Mw(), checkout.Checkout)...)\n\t_checkout := root.Group(\"/checkout\", _checkoutMw()...)\n\t_checkout.GET(\"/result\", append(_checkoutresultMw(), checkout.CheckoutResult)...)\n\t_checkout.POST(\"/waiting\", append(_checkoutwaitingMw(), checkout.CheckoutWaiting)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/checkout/middleware.go",
    "content": "// Code generated by hertz generator.\n\npackage checkout\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _checkoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkout0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutresultMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutwaitingMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/product/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage product\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getproductMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _searchproductsMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/product/product_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage product\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/product\", append(_getproductMw(), product.GetProduct)...)\n\troot.GET(\"/search\", append(_searchproductsMw(), product.SearchProducts)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/cart\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/category\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/checkout\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\tcheckout.Register(r)\n\n\tcart.Register(r)\n\n\tcategory.Register(r)\n\n\tproduct.Register(r)\n\n\tauth.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/add_cart_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype AddCartItemService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewAddCartItemService(Context context.Context, RequestContext *app.RequestContext) *AddCartItemService {\n\treturn &AddCartItemService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *AddCartItemService) Run(req *cart.AddCartItemReq) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\t_, err = rpc.CartClient.AddItem(h.Context, &rpccart.AddItemReq{\n\t\tUserId: uint32(frontendUtils.GetUserIdFromCtx(h.Context)),\n\t\tItem: &rpccart.CartItem{\n\t\t\tProductId: req.ProductId,\n\t\t\tQuantity:  uint32(req.ProductNum),\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CategoryService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCategoryService(Context context.Context, RequestContext *app.RequestContext) *CategoryService {\n\treturn &CategoryService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CategoryService) Run(req *category.CategoryReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{CategoryName: req.Category})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"title\": \"Category\",\n\t\t\"items\": p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutService(Context context.Context, RequestContext *app.RequestContext) *CheckoutService {\n\treturn &CheckoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{UserId: uint32(userId)})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\n\tfor _, v := range carts.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{\n\t\t\tId: v.ProductId,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":    p.Name,\n\t\t\t\"Price\":   strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\": p.Picture,\n\t\t\t\"Qty\":     strconv.Itoa(int(v.Quantity)),\n\t\t})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Checkout\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/checkout_result.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutResultService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutResultService(Context context.Context, RequestContext *app.RequestContext) *CheckoutResultService {\n\treturn &CheckoutResultService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutResultService) Run(req *common.Empty) (resp map[string]any, err error) {\n\treturn utils.H{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/checkout_waiting.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\trpcpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutWaitingService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutWaitingService(Context context.Context, RequestContext *app.RequestContext) *CheckoutWaitingService {\n\treturn &CheckoutWaitingService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutWaitingService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\t_, err = rpc.CheckoutClient.Checkout(h.Context, &rpccheckout.CheckoutReq{\n\t\tUserId:    uint32(userId),\n\t\tEmail:     req.Email,\n\t\tFirstname: req.Firstname,\n\t\tLastname:  req.Lastname,\n\t\tAddress: &rpccheckout.Address{\n\t\t\tCountry:       req.Country,\n\t\t\tZipCode:       req.Zipcode,\n\t\t\tCity:          req.City,\n\t\t\tState:         req.Province,\n\t\t\tStreetAddress: req.Street,\n\t\t},\n\t\tCreditCard: &rpcpayment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CardNum,\n\t\t\tCreditCardExpirationYear:  req.ExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.ExpirationMonth,\n\t\t\tCreditCardCvv:             req.Cvv,\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"title\":    \"waiting\",\n\t\t\"redirect\": \"/checkout/result\",\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetCartService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetCartService(Context context.Context, RequestContext *app.RequestContext) *GetCartService {\n\treturn &GetCartService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetCartService) Run(req *common.Empty) (resp map[string]any, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tcartResp, err := rpc.CartClient.GetCart(h.Context, &cart.GetCartReq{\n\t\tUserId: uint32(frontendUtils.GetUserIdFromCtx(h.Context)),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar items []map[string]string\n\tvar total float64\n\tfor _, item := range cartResp.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &product.GetProductReq{Id: item.ProductId})\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":        p.Name,\n\t\t\t\"Description\": p.Description,\n\t\t\t\"Price\":       strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\":     p.Picture,\n\t\t\t\"Qty\":         strconv.Itoa(int(item.Quantity)),\n\t\t})\n\t\ttotal += float64(p.Price) * float64(item.Quantity)\n\n\t}\n\treturn utils.H{\n\t\t\"title\": \"Cart\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetProductService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetProductService(Context context.Context, RequestContext *app.RequestContext) *GetProductService {\n\treturn &GetProductService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetProductService) Run(req *product.ProductReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: req.Id})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"item\": p.Product,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (res map[string]any, err error) {\n\tproducts, err := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Hot sale\",\n\t\t\"items\": products.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (redirect string, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tresp, err := rpc.UserClient.Login(h.Context, &user.LoginReq{\n\t\tEmail:    req.Email,\n\t\tPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", resp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tredirect = \"/\"\n\tif req.Next != \"\" {\n\t\tredirect = req.Next\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tuserResp, err := rpc.UserClient.Register(h.Context, &user.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tPasswordConfirm: req.PasswordConfirm,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", userResp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype SearchProductsService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewSearchProductsService(Context context.Context, RequestContext *app.RequestContext) *SearchProductsService {\n\treturn &SearchProductsService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *SearchProductsService) Run(req *product.SearchProductsReq) (resp map[string]any, err error) {\n\tproducts, err := rpc.ProductClient.SearchProducts(h.Context, &rpcproduct.SearchProductsReq{\n\t\tQuery: req.Q,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"items\": products.Results,\n\t\t\"q\":     req.Q,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tuserId := frontendUtils.GetUserIdFromCtx(ctx)\n\tcontent[\"user_id\"] = userId\n\n\tif userId > 0 {\n\t\tcartResp, err := rpc.CartClient.GetCart(ctx, &cart.GetCartReq{\n\t\t\tUserId: uint32(userId),\n\t\t})\n\t\tif err == nil && cartResp != nil {\n\t\t\tcontent[\"cart_num\"] = len(cartResp.Items)\n\t\t}\n\t}\n\n\treturn content\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.8.1\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115\n\tgithub.com/hertz-contrib/logger/logrus v1.0.1\n\tgithub.com/hertz-contrib/pprof v0.1.2\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgoogle.golang.org/protobuf v1.34.1\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.8.1 h1:3Upzd9o5yNPz6rLx70J5xpo5emosKNkmwW00WgQhf/0=\ngithub.com/cloudwego/hertz v0.8.1/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115 h1:EvTFSVPZhC2O2i3Krhutdje4sSXSc4nmLTkTttKh/s0=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/logrus v1.0.1 h1:1iFu/L92QlFSDXUn77WJL32dk/5HBzAUziG1OqcNMeE=\ngithub.com/hertz-contrib/logger/logrus v1.0.1/go.mod h1:SqDYLwVq5hTItYqimgZQbFCYPOIGNvBTq0Ip2OQwMcY=\ngithub.com/hertz-contrib/pprof v0.1.2 h1:eC4jpg8ToSi+9YEOPIr3jki8e/ix3aFPtphCgJ36T6Q=\ngithub.com/hertz-contrib/pprof v0.1.2/go.mod h1:OKXw5wCUcy1OVwgQLsoCS9JzfcdjoofP+7Uk4c7P9Po=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=\ngithub.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is generated, with a higher priority than api_version\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the client code is generated\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[37]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12,\n\t0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76,\n\t0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t4,  // 37: api.reserve:extendee -> google.protobuf.MessageOptions\n\t38, // [38:38] is the sub-list for method output_type\n\t38, // [38:38] is the sub-list for method input_type\n\t38, // [38:38] is the sub-list for extension type_name\n\t0,  // [0:38] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 38,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\" form:\"password_confirm\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x73, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2,\n\t0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52,\n\t0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69,\n\t0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69,\n\t0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73,\n\t0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x12, 0x3f, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb,\n\t0x18, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,\n\t0x72, 0x6d, 0x52, 0x0f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x72, 0x6d, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x17, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x4c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0f, 0xd2,\n\t0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x52,\n\t0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,\n\t0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x12,\n\t0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,\n\t0x65, 0x72, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x4b,\n\t0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*LoginReq)(nil),     // 0: frontend.auth.LoginReq\n\t(*RegisterReq)(nil),  // 1: frontend.auth.RegisterReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t1, // 1: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/hertz_gen/frontend/cart/cart_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: cart_page.proto\n\npackage cart\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AddCartItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId  uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\" form:\"productId\"`\n\tProductNum int32  `protobuf:\"varint,2,opt,name=product_num,json=productNum,proto3\" json:\"product_num,omitempty\" form:\"productNum\"`\n}\n\nfunc (x *AddCartItemReq) Reset() {\n\t*x = AddCartItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddCartItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddCartItemReq) ProtoMessage() {}\n\nfunc (x *AddCartItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddCartItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddCartItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AddCartItemReq) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *AddCartItemReq) GetProductNum() int32 {\n\tif x != nil {\n\t\treturn x.ProductNum\n\t}\n\treturn 0\n}\n\nvar File_cart_page_proto protoreflect.FileDescriptor\n\nvar file_cart_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x6f, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65,\n\t0x6d, 0x52, 0x65, 0x71, 0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0d, 0xe2, 0xbb, 0x18, 0x09, 0x70, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x75,\n\t0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0e, 0xe2, 0xbb, 0x18, 0x0a, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x4e, 0x75, 0x6d, 0x32, 0xa4, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74,\n\t0x65, 0x6d, 0x12, 0x1d, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x72, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65,\n\t0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x09, 0xd2, 0xc1, 0x18, 0x05, 0x2f,\n\t0x63, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12,\n\t0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x09, 0xca, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x42, 0x4b, 0x5a, 0x49, 0x67, 0x69,\n\t0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65,\n\t0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61,\n\t0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f,\n\t0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_page_proto_rawDescOnce sync.Once\n\tfile_cart_page_proto_rawDescData = file_cart_page_proto_rawDesc\n)\n\nfunc file_cart_page_proto_rawDescGZIP() []byte {\n\tfile_cart_page_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_page_proto_rawDescData)\n\t})\n\treturn file_cart_page_proto_rawDescData\n}\n\nvar file_cart_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_cart_page_proto_goTypes = []interface{}{\n\t(*AddCartItemReq)(nil), // 0: frontend.cart.AddCartItemReq\n\t(*common.Empty)(nil),   // 1: frontend.common.Empty\n}\nvar file_cart_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.cart.CartService.AddCartItem:input_type -> frontend.cart.AddCartItemReq\n\t1, // 1: frontend.cart.CartService.GetCart:input_type -> frontend.common.Empty\n\t1, // 2: frontend.cart.CartService.AddCartItem:output_type -> frontend.common.Empty\n\t1, // 3: frontend.cart.CartService.GetCart:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_page_proto_init() }\nfunc file_cart_page_proto_init() {\n\tif File_cart_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddCartItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_page_proto_goTypes,\n\t\tDependencyIndexes: file_cart_page_proto_depIdxs,\n\t\tMessageInfos:      file_cart_page_proto_msgTypes,\n\t}.Build()\n\tFile_cart_page_proto = out.File\n\tfile_cart_page_proto_rawDesc = nil\n\tfile_cart_page_proto_goTypes = nil\n\tfile_cart_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/hertz_gen/frontend/category/category_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: category_page.proto\n\npackage category\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CategoryReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory string `protobuf:\"bytes,1,opt,name=category,proto3\" json:\"category,omitempty\" path:\"category\"`\n}\n\nfunc (x *CategoryReq) Reset() {\n\t*x = CategoryReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_category_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryReq) ProtoMessage() {}\n\nfunc (x *CategoryReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_category_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryReq.ProtoReflect.Descriptor instead.\nfunc (*CategoryReq) Descriptor() ([]byte, []int) {\n\treturn file_category_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CategoryReq) GetCategory() string {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn \"\"\n}\n\nvar File_category_page_proto protoreflect.FileDescriptor\n\nvar file_category_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x08, 0x63, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xd2, 0xbb, 0x18,\n\t0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x32, 0x6e, 0x0a, 0x0f, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13,\n\t0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2f, 0x3a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x42, 0x4f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d,\n\t0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_category_page_proto_rawDescOnce sync.Once\n\tfile_category_page_proto_rawDescData = file_category_page_proto_rawDesc\n)\n\nfunc file_category_page_proto_rawDescGZIP() []byte {\n\tfile_category_page_proto_rawDescOnce.Do(func() {\n\t\tfile_category_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_category_page_proto_rawDescData)\n\t})\n\treturn file_category_page_proto_rawDescData\n}\n\nvar file_category_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_category_page_proto_goTypes = []interface{}{\n\t(*CategoryReq)(nil),  // 0: frontend.category.CategoryReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_category_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.category.CategoryService.Category:input_type -> frontend.category.CategoryReq\n\t1, // 1: frontend.category.CategoryService.Category:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_category_page_proto_init() }\nfunc file_category_page_proto_init() {\n\tif File_category_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_category_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_category_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_category_page_proto_goTypes,\n\t\tDependencyIndexes: file_category_page_proto_depIdxs,\n\t\tMessageInfos:      file_category_page_proto_msgTypes,\n\t}.Build()\n\tFile_category_page_proto = out.File\n\tfile_category_page_proto_rawDesc = nil\n\tfile_category_page_proto_goTypes = nil\n\tfile_category_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/hertz_gen/frontend/checkout/checkout_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: checkout_page.proto\n\npackage checkout\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tFirstname       string `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\" form:\"firstname\"`\n\tLastname        string `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\" form:\"lastname\"`\n\tStreet          string `protobuf:\"bytes,4,opt,name=street,proto3\" json:\"street,omitempty\" form:\"street\"`\n\tZipcode         string `protobuf:\"bytes,5,opt,name=zipcode,proto3\" json:\"zipcode,omitempty\" form:\"zipcode\"`\n\tProvince        string `protobuf:\"bytes,6,opt,name=province,proto3\" json:\"province,omitempty\" form:\"province\"`\n\tCountry         string `protobuf:\"bytes,7,opt,name=country,proto3\" json:\"country,omitempty\" form:\"country\"`\n\tCity            string `protobuf:\"bytes,8,opt,name=city,proto3\" json:\"city,omitempty\" form:\"city\"`\n\tCardNum         string `protobuf:\"bytes,9,opt,name=card_num,json=cardNum,proto3\" json:\"card_num,omitempty\" form:\"cardNum\"`\n\tExpirationMonth int32  `protobuf:\"varint,10,opt,name=expiration_month,json=expirationMonth,proto3\" json:\"expiration_month,omitempty\" form:\"expirationMonth\"`\n\tExpirationYear  int32  `protobuf:\"varint,11,opt,name=expiration_year,json=expirationYear,proto3\" json:\"expiration_year,omitempty\" form:\"expirationYear\"`\n\tCvv             int32  `protobuf:\"varint,12,opt,name=cvv,proto3\" json:\"cvv,omitempty\" form:\"cvv\"`\n\tPayment         string `protobuf:\"bytes,13,opt,name=payment,proto3\" json:\"payment,omitempty\" form:\"payment\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetStreet() string {\n\tif x != nil {\n\t\treturn x.Street\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetZipcode() string {\n\tif x != nil {\n\t\treturn x.Zipcode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCardNum() string {\n\tif x != nil {\n\t\treturn x.CardNum\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationMonth\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetCvv() int32 {\n\tif x != nil {\n\t\treturn x.Cvv\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetPayment() string {\n\tif x != nil {\n\t\treturn x.Payment\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_page_proto protoreflect.FileDescriptor\n\nvar file_checkout_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa6, 0x04, 0x0a, 0x0b, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d,\n\t0xe2, 0xbb, 0x18, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x0a, 0xe2, 0xbb, 0x18, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x52, 0x06,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x7a, 0x69, 0x70,\n\t0x63, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a,\n\t0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70,\n\t0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x63, 0x6f,\n\t0x75, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c,\n\t0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xe2, 0xbb,\n\t0x18, 0x04, 0x63, 0x69, 0x74, 0x79, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x08,\n\t0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b,\n\t0xe2, 0xbb, 0x18, 0x07, 0x63, 0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x52, 0x07, 0x63, 0x61, 0x72,\n\t0x64, 0x4e, 0x75, 0x6d, 0x12, 0x3e, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13,\n\t0xe2, 0xbb, 0x18, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f,\n\t0x6e, 0x74, 0x68, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x6f, 0x6e, 0x74, 0x68, 0x12, 0x3b, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, 0xe2,\n\t0xbb, 0x18, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x12, 0x19, 0x0a, 0x03, 0x63, 0x76, 0x76, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xe2, 0xbb, 0x18, 0x03, 0x63, 0x76, 0x76, 0x52, 0x03, 0x63, 0x76, 0x76, 0x12, 0x25, 0x0a, 0x07,\n\t0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2,\n\t0xbb, 0x18, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x32, 0x96, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x22, 0x0d, 0xca, 0xc1, 0x18, 0x09, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f,\n\t0x75, 0x74, 0x12, 0x60, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x57, 0x61,\n\t0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f,\n\t0x75, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0xd2,\n\t0xc1, 0x18, 0x11, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x77, 0x61, 0x69,\n\t0x74, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0xca, 0xc1, 0x18, 0x10, 0x2f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x4f, 0x5a, 0x4d,\n\t0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64,\n\t0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f,\n\t0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_page_proto_rawDescOnce sync.Once\n\tfile_checkout_page_proto_rawDescData = file_checkout_page_proto_rawDesc\n)\n\nfunc file_checkout_page_proto_rawDescGZIP() []byte {\n\tfile_checkout_page_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_page_proto_rawDescData)\n\t})\n\treturn file_checkout_page_proto_rawDescData\n}\n\nvar file_checkout_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_checkout_page_proto_goTypes = []interface{}{\n\t(*CheckoutReq)(nil),  // 0: frontend.checkout.CheckoutReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_checkout_page_proto_depIdxs = []int32{\n\t1, // 0: frontend.checkout.CheckoutService.Checkout:input_type -> frontend.common.Empty\n\t0, // 1: frontend.checkout.CheckoutService.CheckoutWaiting:input_type -> frontend.checkout.CheckoutReq\n\t1, // 2: frontend.checkout.CheckoutService.CheckoutResult:input_type -> frontend.common.Empty\n\t1, // 3: frontend.checkout.CheckoutService.Checkout:output_type -> frontend.common.Empty\n\t1, // 4: frontend.checkout.CheckoutService.CheckoutWaiting:output_type -> frontend.common.Empty\n\t1, // 5: frontend.checkout.CheckoutService.CheckoutResult:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_page_proto_init() }\nfunc file_checkout_page_proto_init() {\n\tif File_checkout_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_page_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_page_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_page_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_page_proto = out.File\n\tfile_checkout_page_proto_rawDesc = nil\n\tfile_checkout_page_proto_goTypes = nil\n\tfile_checkout_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x1a, 0x09, 0x61, 0x70, 0x69,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x4c, 0x0a,\n\t0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x04,\n\t0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a, 0x49, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.home.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.home.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/hertz_gen/frontend/product/product_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: product_page.proto\n\npackage product\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\" query:\"id\"`\n}\n\nfunc (x *ProductReq) Reset() {\n\t*x = ProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProductReq) ProtoMessage() {}\n\nfunc (x *ProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProductReq.ProtoReflect.Descriptor instead.\nfunc (*ProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQ string `protobuf:\"bytes,1,opt,name=q,proto3\" json:\"q,omitempty\" query:\"q\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *SearchProductsReq) GetQ() string {\n\tif x != nil {\n\t\treturn x.Q\n\t}\n\treturn \"\"\n}\n\nvar File_product_page_proto protoreflect.FileDescriptor\n\nvar file_product_page_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,\n\t0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x42, 0x06, 0xb2, 0xbb, 0x18, 0x02, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x22, 0x28,\n\t0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x12, 0x13, 0x0a, 0x01, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05,\n\t0xb2, 0xbb, 0x18, 0x01, 0x71, 0x52, 0x01, 0x71, 0x32, 0xbe, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x47,\n\t0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x0c, 0xca, 0xc1, 0x18, 0x08, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x5a, 0x0a,\n\t0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12,\n\t0x23, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0b, 0xca, 0xc1,\n\t0x18, 0x07, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74,\n\t0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67,\n\t0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c,\n\t0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68,\n\t0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_product_page_proto_rawDescOnce sync.Once\n\tfile_product_page_proto_rawDescData = file_product_page_proto_rawDesc\n)\n\nfunc file_product_page_proto_rawDescGZIP() []byte {\n\tfile_product_page_proto_rawDescOnce.Do(func() {\n\t\tfile_product_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_page_proto_rawDescData)\n\t})\n\treturn file_product_page_proto_rawDescData\n}\n\nvar file_product_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_product_page_proto_goTypes = []interface{}{\n\t(*ProductReq)(nil),        // 0: frontend.product.ProductReq\n\t(*SearchProductsReq)(nil), // 1: frontend.product.SearchProductsReq\n\t(*common.Empty)(nil),      // 2: frontend.common.Empty\n}\nvar file_product_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.product.ProductService.GetProduct:input_type -> frontend.product.ProductReq\n\t1, // 1: frontend.product.ProductService.SearchProducts:input_type -> frontend.product.SearchProductsReq\n\t2, // 2: frontend.product.ProductService.GetProduct:output_type -> frontend.common.Empty\n\t2, // 3: frontend.product.ProductService.SearchProducts:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_product_page_proto_init() }\nfunc file_product_page_proto_init() {\n\tif File_product_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_page_proto_goTypes,\n\t\tDependencyIndexes: file_product_page_proto_depIdxs,\n\t\tMessageInfos:      file_product_page_proto_msgTypes,\n\t}.Build()\n\tFile_product_page_proto = out.File\n\tfile_product_page_proto_rawDesc = nil\n\tfile_product_page_proto_goTypes = nil\n\tfile_product_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tUserClient     userservice.Client\n\tProductClient  productcatalogservice.Client\n\tCartClient     cartservice.Client\n\tCheckoutClient checkoutservice.Client\n\tonce           sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitUserClient()\n\t\tinitProductClient()\n\t\tinitCartClient()\n\t\tinitCheckoutClient()\n\t})\n}\n\nfunc initUserClient() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\tUserClient, err = userservice.NewClient(\"user\", client.WithResolver(r))\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCheckoutClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tCheckoutClient, err = checkoutservice.NewClient(\"checkout\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/infra/rpc/client_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\nfunc Test_iniUserClient(t *testing.T) {\n\tinitUserClient()\n\tresp, err := UserClient.Login(context.Background(), &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"jfoajsfoji\",\n\t})\n\tif err != nil {\n\t\tt.Errorf(\"err: %v\", err)\n\t\treturn\n\t}\n\tt.Logf(\"resp: %v\", resp)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzlogrus \"github.com/hertz-contrib/logger/logrus\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\t// init dal\n\t// dal.Init()\n\trpc.InitClient()\n\taddress := conf.GetConf().Hertz.Address\n\th := server.New(server.WithHostPorts(address))\n\n\tregisterMiddleware(h)\n\n\t// add a ping route to test\n\th.GET(\"/ping\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.JSON(consts.StatusOK, utils.H{\"ping\": \"pong\"})\n\t})\n\n\trouter.GeneratedRegister(h)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Static(\"/static\", \"./\")\n\n\th.GET(\"/about\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"about\", utils.H{\"title\": \"About\"})\n\t})\n\n\th.GET(\"/sign-in\", func(c context.Context, ctx *app.RequestContext) {\n\t\tdata := utils.H{\n\t\t\t\"title\": \"Sign In\",\n\t\t\t\"next\":  ctx.Query(\"next\"),\n\t\t}\n\t\tctx.HTML(consts.StatusOK, \"sign-in\", data)\n\t})\n\th.GET(\"/sign-up\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"sign-up\", utils.H{\"title\": \"Sign Up\"})\n\t})\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\tstore, err := redis.NewStore(10, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\n\t// log\n\tlogger := hertzlogrus.NewLogger()\n\thlog.SetLogger(logger)\n\thlog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Hertz.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Hertz.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Hertz.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Hertz.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\thlog.SetOutput(asyncWriter)\n\th.OnShutdown = append(h.OnShutdown, func(ctx context.Context) {\n\t\tasyncWriter.Sync()\n\t})\n\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\t// cores\n\th.Use(cors.Default())\n\n\tmiddleware.Register(h)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tctx = context.WithValue(ctx, frontendUtils.SessionUserId, s.Get(\"user_id\"))\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tuserId := s.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Redirect(302, []byte(\"/sign-in?next=\"+c.FullPath()))\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc Register(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/about.tmpl",
    "content": "{{define \"about\"}}\n{{template \"header\" .}}\n  <div>\n    <img src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" class=\"col-lg-2 col-md-3 col-sm-4\"/>\n    <p>This is community a driven project.</p>\n  </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/cart-num.tmpl",
    "content": "{{define \"cart-num\"}}\n    <a href=\"/cart\" class=\"btn position-relative\">\n        <i class=\"fa-solid fa-cart-shopping fa-xl\">\n        </i>\n        {{ if $.cart_num}}\n        <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\">\n    {{ $.cart_num }}\n            {{ end }}\n  </span>\n    </a>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/cart.tmpl",
    "content": "{{ define \"cart\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <ul class=\"list-group\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n        {{ if $.items }}\n            <div class=\"mt-3 mb-5\">\n                <div class=\"float-end\">\n                    <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                    <a href=\"/checkout\" class=\"btn btn-lg btn-success float-end\">Check out</a>\n                </div>\n            </div>\n        {{else}}\n            <h1 class=\"text-center text-danger\">Your Cart is empty</h1>\n            <div class=\"text-center\"><a href=\"/\">Shop Hot Sale</a></div>\n        {{ end }}\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/category.tmpl",
    "content": "{{ define \"category\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/checkout.tmpl",
    "content": "{{ define \"checkout\" }}\n    {{ template \"header\" . }}\n    <div class=\"row mb-5\">\n        <div class=\"col-lg-8 col-sm-12\">\n            <form method=\"post\" action=\"/checkout/waiting\">\n                <h4 class=\"mb-3 mt-3\">Contact</h4>\n                <label for=\"email\" class=\"form-label col-12\">\n                    <input class=\"form-control\" id=\"email\" type=\"email\" placeholder=\"Email\" name=\"email\"\n                           aria-label=\"email\" value=\"abc@example.com\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">Delivery</h4>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"firstname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"firstname\" class=\"form-control\" placeholder=\"First name\"\n                               name=\"firstname\" value=\"world\">\n                    </label>\n                    <label for=\"lastname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"lastname\" class=\"form-control\" placeholder=\"Last name\" name=\"lastname\"\n                               value=\"hello\">\n                    </label>\n                </div>\n                <label for=\"street\" class=\"mb-3 mt-3 col-12 form-label\">\n                    <input type=\"text\" class=\"form-control\" placeholder=\"Street\" name=\"street\" value=\"7th street\"\n                           id=\"street\">\n                </label>\n                <label for=\"zipcode\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"zipcode\" name=\"zipcode\" placeholder=\"zipcode\"\n                           value=\"310000\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"city\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"city\" class=\"form-control\" placeholder=\"City\" name=\"city\"\n                               value=\"hangzhou\">\n                    </label>\n                    <label for=\"province\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"province\" class=\"form-control\" name=\"province\" placeholder=\"Province\"\n                               value=\"zhejiang\">\n                    </label>\n                </div>\n                <label for=\"country\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"country\" name=\"country\" placeholder=\"Country\"\n                           value=\"china\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">\n                    Payment\n                </h4>\n                <label for=\"card-num\" class=\"form-label col-12\">\n                    <input type=\"text\" id=\"card-num\" class=\"form-control\" name=\"cardNum\" placeholder=\"Card number\"\n                           value=\"424242424242424242\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"expiration-month\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-month\" name=\"expirationMonth\" class=\"form-control\"\n                               placeholder=\"Expiration Month\" value=\"12\">\n                    </label>\n                    <label for=\"expiration-year\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-year\" name=\"expirationYear\" class=\"form-control\"\n                               placeholder=\"Expiration Year\" value=\"2030\">\n                    </label>\n                    <label for=\"cvv\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"cvv\" class=\"form-control\" name=\"cvv\" placeholder=\"cvv\" required>\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"card\" value=\"card\" checked>\n                    <label class=\"form-check-label\" for=\"card\">\n                        Card\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"stripe\" value=\"stripe\" disabled>\n                    <label class=\"form-check-label\" for=\"stripe\">\n                        Stripe\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"paypal\" value=\"paypal\" disabled>\n                    <label class=\"form-check-label\" for=\"paypal\">\n                        Paypal\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"wechat\" value=\"wechat\" disabled>\n                    <label class=\"form-check-label\" for=\"wechat\">\n                        Wechat\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"alipay\" value=\"alipay\" disabled>\n                    <label class=\"form-check-label\" for=\"alipay\">\n                        Alipay\n                    </label>\n                </div>\n                <div class=\"mt-3 mb-3\">\n                    <div class=\"float-end\">\n                        <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                        <input type=\"submit\" class=\"btn btn-success\" value=\"Pay\">\n                    </div>\n                </div>\n            </form>\n        </div>\n        <ul class=\"list-group col-lg-4 col-sm-12\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/footer.tmpl",
    "content": "{{define \"footer\"}}\n</div>\n</main>\n  <footer>\n    <div class=\"text-bg-primary py-5 text-center\">\n      <p>&copy; 2024 <a href=\"https://github.com/cloudwego\" class=\"text-reset\">CloudWeGo</a></p>\n    </div>\n  </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\" integrity=\"sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz\" crossorigin=\"anonymous\"></script>\n  </body>\n</html>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/header.tmpl",
    "content": "{{define \"header\"}}\n<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    {{ if $.redirect }}\n        <meta http-equiv=\"refresh\" content=\"5;url={{$.redirect}}\"/>\n    {{ end}}\n    <title>CloudWeGo Shop</title>\n    <link href=\"/static/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n            integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n</head>\n<body class=\"min-vh-100\">\n<header>\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container\">\n        <img class=\"navbar-brand\" href=\"#\" src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" style=\"height: 3em;\"/>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n        </button>\n        <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n            <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"/\">CloudWeGo Shop</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Categories\n            </a>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"/category/t-shirt\">T-shirt</a></li>\n                <li><a class=\"dropdown-item\" href=\"/category/sticker\">Sticker</a></li>\n            </ul>\n            </li>\n            <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"/about\" >About</a>\n            </li>\n        </ul>\n        <form class=\"d-flex ms-auto\" role=\"search\" action=\"/search\" method=\"get\">\n            <input class=\"form-control me-2\" type=\"search\" name=\"q\" placeholder=\"Search\"\n                   aria-label=\"Search\" value=\"{{ .q }}\">\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n\n        {{ template \"cart-num\" . }}\n\n        {{ if .user_id }}\n        <div class=\"dropdown\">\n            <div class=\"ms-3 dropdown-toggle\" data-bs-toggle=\"dropdown\">\n                <i class=\"fa-solid fa-user fa-lg\"></i>\n                <span>Hello</span>\n            </div>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Order Center</a></li>\n                <li>\n                    <form action=\"/auth/logout\" method=\"post\">\n                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                    </form>\n                </li>\n            </ul>\n        </div>\n        {{ else }}\n        <div class=\"ms-3\">\n        <a type=\"button\" class=\"btn btn-primary\" href=\"/sign-in\">Sign In</a>\n        </div>\n        {{ end }}\n        </div>\n    </div>\n    </nav>\n    <div class=\"text-bg-primary text-center\">\n    <p>This Website is hosted for demo purposes only.It is not an actual shop</p>\n    </div>\n</header>\n<main style=\"min-height: calc(80vh);\">\n<div class=\"container-fluid py-3\">\n<h1 class=\"text-center\">{{$.title}}</h1>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/home.tmpl",
    "content": "{{define \"home\"}}\n{{template \"header\" .}}\n    <div class=\"row\">\n      {{range .items}}\n      <div class=\"card col-xl-3 col-lg-4 col-md-6 col-sm-12 p-5 border-0\">\n        <a href=\"/product?id={{ .Id }}\"  class=\"btn\">\n        <img src=\"{{.Picture}}\" class=\"card-img-top\" alt=\"...\">\n        <div class=\"card-body\">\n          <p class=\"card-text\">{{ .Name}}</p>\n          <h5 class=\"card-title\">{{ .Price}}</h5>\n        </div>\n        </a>\n      </div>\n      {{end}}\n    </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/product.tmpl",
    "content": "{{ define \"product\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div id=\"productPicture\" class=\"carousel slide col-lg-6 col-sm-12\">\n                    <div class=\"carousel-indicators\">\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"0\"\n                                class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"1\"\n                                aria-label=\"Slide 2\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"2\"\n                                aria-label=\"Slide 3\"></button>\n                    </div>\n                    <div class=\"carousel-inner\">\n                        <div class=\"carousel-item active\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                    </div>\n                    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"prev\">\n                        <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Previous</span>\n                    </button>\n                    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"next\">\n                        <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Next</span>\n                    </button>\n                </div>\n                <div class=\"col-lg-1\"></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-center\">\n                    <form action=\"/cart\" method=\"post\">\n                        <h5 class=\"card-title\">{{ .item.Name }}</h5>\n                        <p class=\"card-text\">{{ .item.Description }}</p>\n                        <p class=\"card-text\">${{ .item.Price }}</p>\n                        <input type=\"hidden\" value=\"{{ .item.Id }}\" name=\"productId\">\n                        <label for=\"productNum\">数量：</label>\n                        <input type=\"number\" class=\"form-control mt-3\" id=\"productNum\" name=\"productNum\" value=\"1\"\n                               min=\"1\"/>\n                        <input type=\"submit\" class=\"btn btn-primary mt-3\" value=\"Add to Cart\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/required.tmpl",
    "content": "{{ define \"required\" }}\n<span class=\"text-danger\">*</span>\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/result.tmpl",
    "content": "{{ define \"result\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <i class=\"fa-regular fa-circle-check fs-1 text-success\"></i>\n        <div class=\"text-center fs-3\">\n            Congratulations, you have successfully placed an order.\n        </div>\n    </div>\n    <div class=\"d-flex justify-content-center\">\n        <a href=\"/order\" class=\"btn btn-info\">Check Order</a>\n        <a href=\"/\" class=\"btn btn-success ms-5\">Back to Home</a>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/search.tmpl",
    "content": "{{ define \"search\" }}\n    {{ template \"header\" . }}\n    {{ if .q }}\n        <div class=\"d-inline-block border border-success rounded-4 p-1 ps-4 pe-4\">\n            <div>\n                {{ .q }}\n                <a href=\"/\" class=\"ps-4\">\n                    <button type=\"button\" class=\"btn btn-sm btn-danger\" aria-label=\"Close\">X</button>\n                </a>\n            </div>\n        </div>\n    {{ end}}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/sign-in.tmpl",
    "content": "{{define \"sign-in\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/login?next={{ .next }}\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign Up</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign In</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/sign-up.tmpl",
    "content": "{{define \"sign-up\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password_confirm\" class=\"form-label\">Password Confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password_confirm\" name=\"password_confirm\">\n              </div>\n            <div class=\"mb-3\">\n                Already have a account, click here to <a href=\"/sign-in\">Sign In</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign Up</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/template/waiting.tmpl",
    "content": "{{ define \"waiting\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <div class=\"text-danger h3 text-center mb-5\">\n            Wait a minutes, please don't close the window\n        </div>\n        <div class=\"spinner-grow text-primary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-secondary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-success\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-danger\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-warning\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-info\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-light\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-dark\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\ntype SessionUserIdKey string\n\nconst SessionUserId SessionUserIdKey = \"user_id\"\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) int32 {\n\tuserId := ctx.Value(SessionUserId)\n\tif userId == nil {\n\t\treturn 0\n\t}\n\treturn userId.(int32)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tDB.AutoMigrate(&model.PaymentLog{})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/biz/model/payment.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype PaymentLog struct {\n\tgorm.Model\n\tUserId        uint32    `json:\"user_id\"`\n\tOrderId       string    `json:\"order_id\"`\n\tTransactionId string    `json:\"transaction_id\"`\n\tAmount        float32   `json:\"amount\"`\n\tPayAt         time.Time `json:\"pay_at\"`\n}\n\nfunc (p PaymentLog) TableName() string {\n\treturn \"payment_log\"\n}\n\nfunc CreatePaymentLog(db *gorm.DB, ctx context.Context, payment *PaymentLog) error {\n\treturn db.WithContext(ctx).Model(&PaymentLog{}).Create(payment).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/biz/service/charge.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\tcreditcard \"github.com/durango/go-credit-card\"\n\t\"github.com/google/uuid\"\n)\n\ntype ChargeService struct {\n\tctx context.Context\n} // NewChargeService new ChargeService\nfunc NewChargeService(ctx context.Context) *ChargeService {\n\treturn &ChargeService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ChargeService) Run(req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\t// Finish your business logic.\n\tcard := creditcard.Card{\n\t\tNumber: req.CreditCard.CreditCardNumber,\n\t\tCvv:    strconv.Itoa(int(req.CreditCard.CreditCardCvv)),\n\t\tMonth:  strconv.Itoa(int(req.CreditCard.CreditCardExpirationMonth)),\n\t\tYear:   strconv.Itoa(int(req.CreditCard.CreditCardExpirationYear)),\n\t}\n\n\terr = card.Validate(true)\n\tif err != nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(4004001, err.Error())\n\t}\n\ttransactionId, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(4005001, err.Error())\n\t}\n\n\terr = model.CreatePaymentLog(mysql.DB, s.ctx, &model.PaymentLog{\n\t\tUserId:        req.UserId,\n\t\tOrderId:       req.OrderId,\n\t\tTransactionId: transactionId.String(),\n\t\tAmount:        req.Amount,\n\t\tPayAt:         time.Now(),\n\t})\n\tif err != nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(4005002, err.Error())\n\t}\n\n\treturn &payment.ChargeResp{TransactionId: transactionId.String()}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/biz/service/charge_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n)\n\nfunc TestCharge_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewChargeService(ctx)\n\t// init req and assert value\n\n\treq := &payment.ChargeReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"payment\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/payment\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.2\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca h1:TE5KFwos5Gxn1IHdwW05E98wZ/nM9efZe12D8h5eunA=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca/go.mod h1:0miM9JonVZc9rPFBnCJpeoPiANNzT9ZfbJR3hDlXu14=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082 h1:3RgcPZrUWhrxqhtDkuRmDTRVXGkxrVMZtJMic7cEtGA=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082/go.mod h1:jKPLGXGRR3v90kZOLs/kUMffoEot8IrRDGmmzI3kOtg=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.2 h1:L0L3fcSNReTRGyZ6AqAEN0K56wYeYAwapBIhkvh0f3E=\ngithub.com/redis/go-redis/v9 v9.5.2/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/service\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n)\n\n// PaymentServiceImpl implements the last service interface defined in the IDL.\ntype PaymentServiceImpl struct{}\n\n// Charge implements the PaymentServiceImpl interface.\nfunc (s *PaymentServiceImpl) Charge(ctx context.Context, req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tresp, err = service.NewChargeService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'payment'\n  ToolVersion: 'v0.9.0'\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := paymentservice.NewServer(new(PaymentServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}), server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/payment/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/payment\"\nexec \"$CURDIR/bin/payment\"\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.Product{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Product{},\n\t\t\t&model.Category{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `product`.`category` VALUES (1,'2023-12-06 15:05:06','2023-12-06 15:05:06','T-Shirt','T-Shirt'),(2,'2023-12-06 15:05:06','2023-12-06 15:05:06','Sticker','Sticker')\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product` VALUES ( 1, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Notebook', 'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ', '/static/image/notebook.jpeg', 9.90 ), ( 2, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Mouse-Pad', 'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ', '/static/image/mouse-pad.jpeg', 8.80 ), ( 3, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt.jpeg', 6.60 ), ( 4, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-1.jpeg', 2.20 ), ( 5, '2023-12-06 15:26:19', '2023-12-09 22:32:35', 'Sweatshirt', 'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.', '/static/image/sweatshirt.jpeg', 1.10 ), ( 6, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-2.jpeg', 1.80 ), ( 7, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'mascot', 'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.', '/static/image/logo.jpg', 4.80 )\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product_category` (product_id,category_id) VALUES ( 1, 2 ), ( 2, 2 ), ( 3, 1 ), ( 4, 1 ), ( 5, 1 ), ( 6, 1 ),( 7, 2 )\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/model/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Category struct {\n\tBase\n\tName        string `json:\"name\"`\n\tDescription string `json:\"description\"`\n\n\tProducts []Product `json:\"product\" gorm:\"many2many:product_category\"`\n}\n\nfunc (c Category) TableName() string {\n\treturn \"category\"\n}\n\ntype CategoryQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (c CategoryQuery) GetProductsByCategoryName(name string) (categories []Category, err error) {\n\terr = c.db.WithContext(c.ctx).Model(&Category{}).Where(&Category{Name: name}).Preload(\"Products\").Find(&categories).Error\n\treturn\n}\n\nfunc NewCategoryQuery(ctx context.Context, db *gorm.DB) *CategoryQuery {\n\treturn &CategoryQuery{\n\t\tctx: ctx,\n\t\tdb:  db,\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/model/product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tBase\n\tName        string  `json:\"name\"`\n\tDescription string  `json:\"description\"`\n\tPicture     string  `json:\"picture\"`\n\tPrice       float32 `json:\"price\"`\n\n\tCategories []Category `json:\"categories\" gorm:\"many2many:product_category\"`\n}\n\nfunc (p Product) TableName() string {\n\treturn \"product\"\n}\n\ntype ProductQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (p ProductQuery) GetById(productId int) (product Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).First(&product, productId).Error\n\treturn\n}\n\nfunc (p ProductQuery) SearchProducts(q string) (products []*Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).Find(&products, \"name like ? or description like ?\",\n\t\t\"%\"+q+\"%\", \"%\"+q+\"%\",\n\t).Error\n\treturn\n}\n\nfunc NewProductQuery(ctx context.Context, db *gorm.DB) *ProductQuery {\n\treturn &ProductQuery{\n\t\tctx: ctx,\n\t\tdb:  db,\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetProductService struct {\n\tctx context.Context\n} // NewGetProductService new GetProductService\nfunc NewGetProductService(ctx context.Context) *GetProductService {\n\treturn &GetProductService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetProductService) Run(req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tif req.Id == 0 {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(2004001, \"product id is required\")\n\t}\n\tproductQuery := model.NewProductQuery(s.ctx, mysql.DB)\n\n\tp, err := productQuery.GetById(int(req.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &product.GetProductResp{\n\t\tProduct: &product.Product{\n\t\t\tId:          uint32(p.ID),\n\t\t\tPicture:     p.Picture,\n\t\t\tPrice:       p.Price,\n\t\t\tDescription: p.Description,\n\t\t\tName:        p.Name,\n\t\t},\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/service/get_product_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\nfunc TestGetProduct_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewGetProductService(ctx)\n\t// init req and assert value\n\n\treq := &product.GetProductReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/service/list_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype ListProductsService struct {\n\tctx context.Context\n} // NewListProductsService new ListProductsService\nfunc NewListProductsService(ctx context.Context) *ListProductsService {\n\treturn &ListProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListProductsService) Run(req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\t// Finish your business logic.\n\tcategoryQuery := model.NewCategoryQuery(s.ctx, mysql.DB)\n\n\tc, err := categoryQuery.GetProductsByCategoryName(req.CategoryName)\n\tresp = &product.ListProductsResp{}\n\tfor _, v1 := range c {\n\t\tfor _, v := range v1.Products {\n\t\t\tresp.Products = append(resp.Products, &product.Product{\n\t\t\t\tId:          uint32(v.ID),\n\t\t\t\tName:        v.Name,\n\t\t\t\tDescription: v.Description,\n\t\t\t\tPicture:     v.Picture,\n\t\t\t\tPrice:       v.Price,\n\t\t\t})\n\t\t}\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/service/list_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\nfunc TestListProducts_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewListProductsService(ctx)\n\t// init req and assert value\n\n\treq := &product.ListProductsReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype SearchProductsService struct {\n\tctx context.Context\n} // NewSearchProductsService new SearchProductsService\nfunc NewSearchProductsService(ctx context.Context) *SearchProductsService {\n\treturn &SearchProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SearchProductsService) Run(req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\t// Finish your business logic.\n\tproductQuery := model.NewProductQuery(s.ctx, mysql.DB)\n\tproducts, err := productQuery.SearchProducts(req.Query)\n\tvar results []*product.Product\n\tfor _, v := range products {\n\t\tresults = append(results, &product.Product{\n\t\t\tId:          uint32(v.ID),\n\t\t\tName:        v.Name,\n\t\t\tDescription: v.Description,\n\t\t\tPicture:     v.Picture,\n\t\t\tPrice:       v.Price,\n\t\t})\n\t}\n\n\treturn &product.SearchProductsResp{Results: results}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/biz/service/search_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\nfunc TestSearchProducts_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewSearchProductsService(ctx)\n\t// init req and assert value\n\n\treq := &product.SearchProductsReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"product\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/product\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.2\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca h1:TE5KFwos5Gxn1IHdwW05E98wZ/nM9efZe12D8h5eunA=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca/go.mod h1:0miM9JonVZc9rPFBnCJpeoPiANNzT9ZfbJR3hDlXu14=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638 h1:b7mQxlMUT7APPFecvzetyPC8fJCVOOnd0zMspF7jqwc=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.2 h1:L0L3fcSNReTRGyZ6AqAEN0K56wYeYAwapBIhkvh0f3E=\ngithub.com/redis/go-redis/v9 v9.5.2/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/service\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\n// ProductCatalogServiceImpl implements the last service interface defined in the IDL.\ntype ProductCatalogServiceImpl struct{}\n\n// ListProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) ListProducts(ctx context.Context, req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\tresp, err = service.NewListProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetProduct implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) GetProduct(ctx context.Context, req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tresp, err = service.NewGetProductService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// SearchProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) SearchProducts(ctx context.Context, req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\tresp, err = service.NewSearchProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'product'\n  ToolVersion: 'v0.9.0'\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := productcatalogservice.NewServer(new(ProductCatalogServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}), server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/product\"\nexec \"$CURDIR/bin/product\"\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/script/product.sql",
    "content": "CREATE TABLE `category`\n(\n    `id`          int          NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)  NOT NULL,\n    `description` varchar(255) NOT NULL,\n    `created_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `category`\nVALUES (1, 'Clothes', 'Clothes', '2023-12-06 15:05:06', '2023-12-06 15:05:06'),\n       (2, 'Other', 'Other', '2023-12-06 15:05:06', '2023-12-06 15:05:06');\nCREATE TABLE `product`\n(\n    `id`          int            NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)    NOT NULL,\n    `description` varchar(255)   NOT NULL,\n    `picture`     varchar(255)   NOT NULL,\n    `price`       decimal(10, 2) NOT NULL,\n    `created_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product`\nVALUES (1, 'Notebook',\n        'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ',\n        '/static/image/notebook.jpeg', 9.90, '2023-12-06 15:26:19', '2023-12-09 22:29:10'),\n       (2, 'Mouse-Pad',\n        'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ',\n        '/static/image/mouse-pad.jpeg', 8.80, '2023-12-06 15:26:19', '2023-12-09 22:29:59'),\n       (3, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt.jpeg', 6.60, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (4, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-1.jpeg', 2.20, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (5, 'Sweatshirt',\n        'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.',\n        '/static/image/sweatshirt.jpeg', 1.10, '2023-12-06 15:26:19', '2023-12-09 22:32:35'),\n       (6, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-2.jpeg', 1.80, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (10, 'mascot',\n        'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.',\n        '/static/image/logo.jpg', 4.80, '2023-12-06 15:26:19', '2023-12-09 22:39:47');\nCREATE TABLE `product_category`\n(\n    `id`          int      NOT NULL AUTO_INCREMENT,\n    `product_id`  int      NOT NULL,\n    `category_id` int      NOT NULL,\n    `created_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product_category`\nVALUES (1, 1, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (2, 2, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (3, 3, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (4, 4, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (5, 5, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (6, 6, 1, '2023-12-06 15:27:30', '2023-12-09 22:41:47'),\n       (10, 10, 2, '2023-12-06 15:27:30', '2023-12-06 15:27:30');"
  },
  {
    "path": "gomall/tutorial/ch12/app/product/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"shop-product\"\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif conf.GetConf().Env != \"online\" {\n\t\terr = DB.AutoMigrate(&model.User{})\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tgorm.Model\n\tEmail          string `gorm:\"uniqueIndex;type:varchar(255) not null\"`\n\tPasswordHashed string `gorm:\"type:varchar(255) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n\nfunc Create(ctx context.Context, db *gorm.DB, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n\nfunc GetByEmail(ctx context.Context, db *gorm.DB, email string) (*User, error) {\n\tvar user User\n\terr := db.WithContext(ctx).Where(\"email = ?\", email).First(&user).Error\n\treturn &user, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\trow, err := model.GetByEmail(s.ctx, mysql.DB, req.Email)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(row.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &user.LoginResp{\n\t\tUserId: int32(row.ID),\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewLoginService(ctx)\n\t// init req and assert value\n\n\treq := &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" || req.PasswordConfirm == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\tif req.Password != req.PasswordConfirm {\n\t\treturn nil, errors.New(\"password not match\")\n\t}\n\tpasswordHashed, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(passwordHashed),\n\t}\n\terr = model.Create(s.ctx, mysql.DB, newUser)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewRegisterService(ctx)\n\t// init req and assert value\n\n\treq := &user.RegisterReq{\n\t\tEmail:           \"1demo@damin.com\",\n\t\tPassword:        \"FJODIAFUFJO\",\n\t\tPasswordConfirm: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.9.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.34.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch12/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/tutorial/ch12/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/tutorial/ch12/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(&model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/biz/dal/redis/init.go",
    "content": "package redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"uniqueIndex;type:varchar(128) not null\"`\n\tPassword string `gorm:\"type:varchar(64) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\t// CURD\n\n\t// Create\n\t// mysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"jfiojffjsoij\"})\n\n\t// Update\n\t// mysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").Update(\"password\", \"22222222\")\n\n\t// Read\n\tvar row model.User\n\tmysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").First(&row)\n\n\tfmt.Printf(\"row: %+v\\n\", row)\n\n\t// Delete\n\t// mysql.DB.Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n\n\t// mysql.DB.Unscoped().Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch12/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch12/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n      - MYSQL_DATABASE=demo_proto\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: \"redis:latest\"\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch12/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/cart\n\t./app/checkout\n\t./app/frontend\n\t./app/payment\n\t./app/product\n\t./app/user\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n    optional string raw_body = 50101;\n    optional string query = 50102;\n    optional string header = 50103;\n    optional string cookie = 50104;\n    optional string body = 50105;\n    optional string path = 50106;\n    optional string vd = 50107;\n    optional string form = 50108;\n    optional string js_conv = 50109;\n    optional string file_name = 50110;\n    optional string none = 50111;\n\n    // 50131~50160 used to extend field option by hz\n    optional string form_compatible = 50131;\n    optional string js_conv_compatible = 50132;\n    optional string file_name_compatible = 50133;\n    optional string none_compatible = 50134;\n    // 50135 is reserved to vt_compatible\n    // optional FieldRules vt_compatible = 50135;\n\n    optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n    optional string get = 50201;\n    optional string post = 50202;\n    optional string put = 50203;\n    optional string delete = 50204;\n    optional string patch = 50205;\n    optional string options = 50206;\n    optional string head = 50207;\n    optional string any = 50208;\n    optional string gen_path = 50301; // The path specified by the user when the client code is generated, with a higher priority than api_version\n    optional string api_version = 50302; // Specify the value of the :version variable in path when the client code is generated\n    optional string tag = 50303; // rpc tag, can be multiple, separated by commas\n    optional string name = 50304; // Name of rpc\n    optional string api_level = 50305; // Interface Level\n    optional string serializer = 50306; // Serialization method\n    optional string param = 50307; // Whether client requests take public parameters\n    optional string baseurl = 50308; // Baseurl used in ttnet routing\n    optional string handler_path = 50309; // handler_path specifies the path to generate the method\n\n    // 50331~50360 used to extend method option by hz\n    optional string handler_path_compatible = 50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n    optional int32 http_code = 50401;\n\n// 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n    optional string base_domain = 50402;\n\n    // 50731~50760 used to extend service option by hz\n    optional string base_domain_compatible = 50731;\n}\n\nextend google.protobuf.MessageOptions {\n    // optional FieldRules msg_vt = 50111;\n\n    optional string reserve = 50830;\n    // 550831 is reserved to msg_vt_compatible\n    // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/idl/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart;\n\noption go_package = \"/cart\";\n\nservice CartService {\n  rpc AddItem (AddItemReq) returns (AddItemResp) {}\n  rpc GetCart (GetCartReq) returns (GetCartResp) {}\n  rpc EmptyCart (EmptyCartReq) returns (EmptyCartResp) {}\n}\n\nmessage CartItem {\n    uint32 product_id = 1;\n    uint32 quantity = 2;\n}\n\nmessage AddItemReq {\n    uint32 user_id = 1;\n    CartItem item = 2;\n}\n\nmessage AddItemResp {}\n\nmessage GetCartReq {\n    uint32 user_id = 1;\n}\n\nmessage GetCartResp {\n    repeated CartItem items = 1;\n}\n\nmessage EmptyCartReq {\n    uint32 user_id = 1;\n}\n\nmessage EmptyCartResp {}"
  },
  {
    "path": "gomall/tutorial/ch12/idl/checkout.proto",
    "content": "syntax = \"proto3\";\n\npackage checkout;\n\nimport \"payment.proto\";\n\noption go_package = \"/checkout\";\n\nservice CheckoutService {\n    rpc Checkout(CheckoutReq) returns (CheckoutResp) {}\n}\n\nmessage CheckoutReq {\n    uint32 user_id = 1;\n    string firstname = 2;\n    string lastname = 3;\n    string email =4;\n    Address address = 5;\n    payment.CreditCardInfo credit_card = 6;\n}\n\nmessage Address {\n    string street_address = 1;\n    string city = 2;\n    string state = 3;\n    string country = 4;\n    string zip_code = 5;\n}\n\nmessage CheckoutResp {\n    string order_id = 1;\n    string transaction_id = 2;\n}"
  },
  {
    "path": "gomall/tutorial/ch12/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch12/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch12/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/auth\";\n\nmessage LoginReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string next = 3 [(api.query)=\"next\"];\n}\n\nmessage RegisterReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string password_confirm = 3 [(api.form)=\"password_confirm\"];\n}\n\nservice AuthService {\n   rpc login(LoginReq) returns(common.Empty) {\n      option (api.post) = \"/auth/login\";\n   }\n   rpc register(RegisterReq) returns(common.Empty) {\n    option (api.post) = \"/auth/register\";\n }\n rpc logout(common.Empty) returns(common.Empty) {\n    option (api.post) = \"/auth/logout\";\n }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/idl/frontend/cart_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.cart;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/cart\";\n\nservice CartService {\n    rpc AddCartItem(AddCartItemReq) returns (common.Empty) {\n        option (api.post) = \"/cart\";\n    }\n    rpc GetCart(common.Empty) returns (common.Empty) {\n        option (api.get) = \"/cart\";\n    }\n}\n\nmessage AddCartItemReq {\n    uint32 product_id = 1 [(api.form) = \"productId\"];\n    int32 product_num = 2 [(api.form) = \"productNum\"];\n}\n\n\n\n\n"
  },
  {
    "path": "gomall/tutorial/ch12/idl/frontend/category_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.category;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/category\";\n\nservice CategoryService {\n    rpc Category(CategoryReq) returns (common.Empty) {\n        option (api.get) = \"/category/:category\";\n    }\n}\n\nmessage CategoryReq {\n    string category = 1 [ (api.path) = \"category\"];\n}\n\n"
  },
  {
    "path": "gomall/tutorial/ch12/idl/frontend/checkout_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.checkout;\n\noption go_package = \"/frontend/checkout\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CheckoutReq {\n    string email = 1 [(api.form) = \"email\"];\n    string firstname = 2 [(api.form) = \"firstname\"];\n    string lastname = 3 [(api.form) = \"lastname\"];\n    string street = 4 [(api.form) = \"street\"];\n    string zipcode = 5 [(api.form) = \"zipcode\"];\n    string province = 6 [(api.form) = \"province\"];\n    string country = 7 [(api.form) = \"country\"];\n    string city = 8 [(api.form) = \"city\"];\n    string card_num = 9 [(api.form)=\"cardNum\"];\n    int32 expiration_month = 10 [(api.form)=\"expirationMonth\"];\n    int32 expiration_year = 11 [(api.form) = \"expirationYear\"];\n    int32 cvv = 12 [(api.form) = \"cvv\"];\n    string payment = 13 [(api.form)= \"payment\"];\n}\n\nservice CheckoutService {\n    rpc Checkout(common.Empty) returns (common.Empty) {\n        option (api.get) = \"/checkout\";\n    }\n    rpc CheckoutWaiting(CheckoutReq) returns (common.Empty) {\n        option (api.post) = \"/checkout/waiting\";\n    }\n    rpc CheckoutResult(common.Empty) returns (common.Empty) {\n        option (api.get) = \"/checkout/result\";\n    }\n}"
  },
  {
    "path": "gomall/tutorial/ch12/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\n\nmessage Empty {}"
  },
  {
    "path": "gomall/tutorial/ch12/idl/frontend/home.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.home;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/home\";\n\nservice HomeService {\n   rpc Home(common.Empty) returns(common.Empty) {\n      option (api.get) = \"/\";\n   }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/idl/frontend/product_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.product;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/product\";\n\nservice ProductService {\n    rpc GetProduct(ProductReq) returns (common.Empty) {\n        option (api.get) = \"/product\";\n    }\n    rpc SearchProducts(SearchProductsReq) returns (common.Empty) {\n        option (api.get) = \"/search\";\n    }\n}\n\nmessage ProductReq {\n    uint32 id = 1 [ (api.query) = \"id\"];\n}\n\nmessage SearchProductsReq {\n    string q = 1 [(api.query) = \"q\"];\n}\n\n"
  },
  {
    "path": "gomall/tutorial/ch12/idl/payment.proto",
    "content": "syntax = \"proto3\";\n\npackage payment;\n\noption go_package =\"/payment\";\n\nservice PaymentService {\n    rpc Charge(ChargeReq) returns (ChargeResp) {}\n}\n\nmessage CreditCardInfo {\n    string credit_card_number = 1;\n    int32 credit_card_cvv = 2;\n    int32 credit_card_expiration_year = 3;\n    int32 credit_card_expiration_month = 4;\n}\n\nmessage ChargeReq {\n    float amount = 1;\n    CreditCardInfo credit_card = 2;\n    string order_id = 3;\n    uint32 user_id = 4;\n}\n\nmessage ChargeResp {\n    string transaction_id = 1;\n}"
  },
  {
    "path": "gomall/tutorial/ch12/idl/product.proto",
    "content": "syntax = \"proto3\";\n\npackage product;\n\noption go_package =\"/product\";\n\nservice ProductCatalogService {\n    rpc ListProducts(ListProductsReq) returns (ListProductsResp) {} ;\n    rpc GetProduct(GetProductReq) returns (GetProductResp) {};\n    rpc SearchProducts (SearchProductsReq) returns (SearchProductsResp) {} ;\n}\n\nmessage ListProductsReq {\n    int32 page = 1;\n    int32 page_size = 2;\n    string category_name = 3;\n}\n\nmessage Product {\n    uint32 id = 1;\n    string name = 2;\n    string description = 3;\n    string picture = 4;\n    float price = 5;\n\n    repeated string categories = 6;\n}\n\nmessage ListProductsResp {\n    repeated Product products = 1;\n}\n\nmessage GetProductReq {\n    uint32 id = 1;\n}\n\nmessage GetProductResp {\n    Product product = 1;\n}\n\nmessage SearchProductsReq {\n    string query = 1;\n}\n\nmessage SearchProductsResp {\n    repeated Product results = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/idl/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"/user\";\n\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string password_confirm = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email = 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n\nservice UserService {\n  rpc Register (RegisterReq) returns (RegisterResp) {}\n  rpc Login (LoginReq) returns (LoginResp) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgoogle.golang.org/protobuf v1.34.1\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.8.2 // indirect\n\tgithub.com/tidwall/gjson v1.9.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/cart/cart.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CartItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CartItem[number], err)\n}\n\nfunc (x *CartItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.ProductId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CartItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Quantity, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_AddItemReq[number], err)\n}\n\nfunc (x *AddItemReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *AddItemResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *GetCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartReq[number], err)\n}\n\nfunc (x *GetCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartResp[number], err)\n}\n\nfunc (x *GetCartResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *EmptyCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmptyCartReq[number], err)\n}\n\nfunc (x *EmptyCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmptyCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *CartItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.ProductId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetProductId())\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Quantity == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 2, x.GetQuantity())\n\treturn offset\n}\n\nfunc (x *AddItemReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItem())\n\treturn offset\n}\n\nfunc (x *AddItemResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *GetCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *EmptyCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *CartItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CartItem) sizeField1() (n int) {\n\tif x.ProductId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetProductId())\n\treturn n\n}\n\nfunc (x *CartItem) sizeField2() (n int) {\n\tif x.Quantity == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(2, x.GetQuantity())\n\treturn n\n}\n\nfunc (x *AddItemReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField2() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetItem())\n\treturn n\n}\n\nfunc (x *AddItemResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nfunc (x *GetCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartResp) sizeField1() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(1, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *EmptyCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *EmptyCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_CartItem = map[int32]string{\n\t1: \"ProductId\",\n\t2: \"Quantity\",\n}\n\nvar fieldIDToName_AddItemReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Item\",\n}\n\nvar fieldIDToName_AddItemResp = map[int32]string{}\n\nvar fieldIDToName_GetCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartResp = map[int32]string{\n\t1: \"Items\",\n}\n\nvar fieldIDToName_EmptyCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_EmptyCartResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/cart/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: cart.proto\n\npackage cart\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\"`\n\tQuantity  uint32 `protobuf:\"varint,2,opt,name=quantity,proto3\" json:\"quantity,omitempty\"`\n}\n\nfunc (x *CartItem) Reset() {\n\t*x = CartItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartItem) ProtoMessage() {}\n\nfunc (x *CartItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartItem.ProtoReflect.Descriptor instead.\nfunc (*CartItem) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartItem) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetQuantity() uint32 {\n\tif x != nil {\n\t\treturn x.Quantity\n\t}\n\treturn 0\n}\n\ntype AddItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32    `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItem   *CartItem `protobuf:\"bytes,2,opt,name=item,proto3\" json:\"item,omitempty\"`\n}\n\nfunc (x *AddItemReq) Reset() {\n\t*x = AddItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemReq) ProtoMessage() {}\n\nfunc (x *AddItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddItemReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *AddItemReq) GetItem() *CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\ntype AddItemResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *AddItemResp) Reset() {\n\t*x = AddItemResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemResp) ProtoMessage() {}\n\nfunc (x *AddItemResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemResp.ProtoReflect.Descriptor instead.\nfunc (*AddItemResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{2}\n}\n\ntype GetCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *GetCartReq) Reset() {\n\t*x = GetCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReq) ProtoMessage() {}\n\nfunc (x *GetCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReq.ProtoReflect.Descriptor instead.\nfunc (*GetCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItems []*CartItem `protobuf:\"bytes,1,rep,name=items,proto3\" json:\"items,omitempty\"`\n}\n\nfunc (x *GetCartResp) Reset() {\n\t*x = GetCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartResp) ProtoMessage() {}\n\nfunc (x *GetCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartResp.ProtoReflect.Descriptor instead.\nfunc (*GetCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetCartResp) GetItems() []*CartItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\ntype EmptyCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *EmptyCartReq) Reset() {\n\t*x = EmptyCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartReq) ProtoMessage() {}\n\nfunc (x *EmptyCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartReq.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *EmptyCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype EmptyCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmptyCartResp) Reset() {\n\t*x = EmptyCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartResp) ProtoMessage() {}\n\nfunc (x *EmptyCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartResp.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{6}\n}\n\nvar File_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x08, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0a, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04,\n\t0x69, 0x74, 0x65, 0x6d, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x25, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65,\n\t0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0b, 0x47, 0x65,\n\t0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x24, 0x0a, 0x05, 0x69, 0x74, 0x65,\n\t0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22,\n\t0x27, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12,\n\t0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,\n\t0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x0f, 0x0a, 0x0d, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x32, 0xa9, 0x01, 0x0a, 0x0b, 0x43, 0x61,\n\t0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49,\n\t0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64,\n\t0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x07, 0x47,\n\t0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x47, 0x65,\n\t0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36, 0x0a,\n\t0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x12, 0x12, 0x2e, 0x63, 0x61, 0x72,\n\t0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x13,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69,\n\t0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70,\n\t0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f,\n\t0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_proto_rawDescOnce sync.Once\n\tfile_cart_proto_rawDescData = file_cart_proto_rawDesc\n)\n\nfunc file_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_proto_rawDescData)\n\t})\n\treturn file_cart_proto_rawDescData\n}\n\nvar file_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_cart_proto_goTypes = []interface{}{\n\t(*CartItem)(nil),      // 0: cart.CartItem\n\t(*AddItemReq)(nil),    // 1: cart.AddItemReq\n\t(*AddItemResp)(nil),   // 2: cart.AddItemResp\n\t(*GetCartReq)(nil),    // 3: cart.GetCartReq\n\t(*GetCartResp)(nil),   // 4: cart.GetCartResp\n\t(*EmptyCartReq)(nil),  // 5: cart.EmptyCartReq\n\t(*EmptyCartResp)(nil), // 6: cart.EmptyCartResp\n}\nvar file_cart_proto_depIdxs = []int32{\n\t0, // 0: cart.AddItemReq.item:type_name -> cart.CartItem\n\t0, // 1: cart.GetCartResp.items:type_name -> cart.CartItem\n\t1, // 2: cart.CartService.AddItem:input_type -> cart.AddItemReq\n\t3, // 3: cart.CartService.GetCart:input_type -> cart.GetCartReq\n\t5, // 4: cart.CartService.EmptyCart:input_type -> cart.EmptyCartReq\n\t2, // 5: cart.CartService.AddItem:output_type -> cart.AddItemResp\n\t4, // 6: cart.CartService.GetCart:output_type -> cart.GetCartResp\n\t6, // 7: cart.CartService.EmptyCart:output_type -> cart.EmptyCartResp\n\t5, // [5:8] is the sub-list for method output_type\n\t2, // [2:5] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_proto_init() }\nfunc file_cart_proto_init() {\n\tif File_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_proto = out.File\n\tfile_cart_proto_rawDesc = nil\n\tfile_cart_proto_goTypes = nil\n\tfile_cart_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CartService interface {\n\tAddItem(ctx context.Context, req *AddItemReq) (res *AddItemResp, err error)\n\tGetCart(ctx context.Context, req *GetCartReq) (res *GetCartResp, err error)\n\tEmptyCart(ctx context.Context, req *EmptyCartReq) (res *EmptyCartResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/cart/cartservice/cartservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfo\n}\n\nvar cartServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CartService\"\n\thandlerType := (*cart.CartService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"AddItem\":   kitex.NewMethodInfo(addItemHandler, newAddItemArgs, newAddItemResult, false),\n\t\t\"GetCart\":   kitex.NewMethodInfo(getCartHandler, newGetCartArgs, newGetCartResult, false),\n\t\t\"EmptyCart\": kitex.NewMethodInfo(emptyCartHandler, newEmptyCartArgs, newEmptyCartResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"cart\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc addItemHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.AddItemReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).AddItem(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *AddItemArgs:\n\t\tsuccess, err := handler.(cart.CartService).AddItem(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*AddItemResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newAddItemArgs() interface{} {\n\treturn &AddItemArgs{}\n}\n\nfunc newAddItemResult() interface{} {\n\treturn &AddItemResult{}\n}\n\ntype AddItemArgs struct {\n\tReq *cart.AddItemReq\n}\n\nfunc (p *AddItemArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.AddItemReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *AddItemArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *AddItemArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *AddItemArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar AddItemArgs_Req_DEFAULT *cart.AddItemReq\n\nfunc (p *AddItemArgs) GetReq() *cart.AddItemReq {\n\tif !p.IsSetReq() {\n\t\treturn AddItemArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *AddItemArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *AddItemArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype AddItemResult struct {\n\tSuccess *cart.AddItemResp\n}\n\nvar AddItemResult_Success_DEFAULT *cart.AddItemResp\n\nfunc (p *AddItemResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.AddItemResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *AddItemResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *AddItemResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *AddItemResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *AddItemResult) GetSuccess() *cart.AddItemResp {\n\tif !p.IsSetSuccess() {\n\t\treturn AddItemResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *AddItemResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.AddItemResp)\n}\n\nfunc (p *AddItemResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *AddItemResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.GetCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).GetCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).GetCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetCartArgs() interface{} {\n\treturn &GetCartArgs{}\n}\n\nfunc newGetCartResult() interface{} {\n\treturn &GetCartResult{}\n}\n\ntype GetCartArgs struct {\n\tReq *cart.GetCartReq\n}\n\nfunc (p *GetCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.GetCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetCartArgs_Req_DEFAULT *cart.GetCartReq\n\nfunc (p *GetCartArgs) GetReq() *cart.GetCartReq {\n\tif !p.IsSetReq() {\n\t\treturn GetCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetCartResult struct {\n\tSuccess *cart.GetCartResp\n}\n\nvar GetCartResult_Success_DEFAULT *cart.GetCartResp\n\nfunc (p *GetCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.GetCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetCartResult) GetSuccess() *cart.GetCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.GetCartResp)\n}\n\nfunc (p *GetCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc emptyCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.EmptyCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).EmptyCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EmptyCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).EmptyCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EmptyCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEmptyCartArgs() interface{} {\n\treturn &EmptyCartArgs{}\n}\n\nfunc newEmptyCartResult() interface{} {\n\treturn &EmptyCartResult{}\n}\n\ntype EmptyCartArgs struct {\n\tReq *cart.EmptyCartReq\n}\n\nfunc (p *EmptyCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.EmptyCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EmptyCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EmptyCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EmptyCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EmptyCartArgs_Req_DEFAULT *cart.EmptyCartReq\n\nfunc (p *EmptyCartArgs) GetReq() *cart.EmptyCartReq {\n\tif !p.IsSetReq() {\n\t\treturn EmptyCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EmptyCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EmptyCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EmptyCartResult struct {\n\tSuccess *cart.EmptyCartResp\n}\n\nvar EmptyCartResult_Success_DEFAULT *cart.EmptyCartResp\n\nfunc (p *EmptyCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.EmptyCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EmptyCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EmptyCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EmptyCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EmptyCartResult) GetSuccess() *cart.EmptyCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn EmptyCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EmptyCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.EmptyCartResp)\n}\n\nfunc (p *EmptyCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EmptyCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) AddItem(ctx context.Context, Req *cart.AddItemReq) (r *cart.AddItemResp, err error) {\n\tvar _args AddItemArgs\n\t_args.Req = Req\n\tvar _result AddItemResult\n\tif err = p.c.Call(ctx, \"AddItem\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetCart(ctx context.Context, Req *cart.GetCartReq) (r *cart.GetCartResp, err error) {\n\tvar _args GetCartArgs\n\t_args.Req = Req\n\tvar _result GetCartResult\n\tif err = p.c.Call(ctx, \"GetCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq) (r *cart.EmptyCartResp, err error) {\n\tvar _args EmptyCartArgs\n\t_args.Req = Req\n\tvar _result EmptyCartResult\n\tif err = p.c.Call(ctx, \"EmptyCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/cart/cartservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCartServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCartServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCartServiceClient) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.AddItem(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetCart(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.EmptyCart(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/cart/cartservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler cart.CartService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/cart/cartservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler cart.CartService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/checkout/checkout.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tfmt \"fmt\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CheckoutReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutReq[number], err)\n}\n\nfunc (x *CheckoutReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Firstname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Lastname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutReq) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v payment.CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutResp[number], err)\n}\n\nfunc (x *CheckoutResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutResp) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Firstname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetFirstname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Lastname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetLastname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField6(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 6, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField2(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField2() (n int) {\n\tif x.Firstname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetFirstname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField3() (n int) {\n\tif x.Lastname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetLastname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField6() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(6, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *CheckoutResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField2() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_CheckoutReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Firstname\",\n\t3: \"Lastname\",\n\t4: \"Email\",\n\t5: \"Address\",\n\t6: \"CreditCard\",\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_CheckoutResp = map[int32]string{\n\t1: \"OrderId\",\n\t2: \"TransactionId\",\n}\n\nvar _ = payment.File_payment_proto\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/checkout/checkout.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: checkout.proto\n\npackage checkout\n\nimport (\n\tcontext \"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId     uint32                  `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tFirstname  string                  `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\"`\n\tLastname   string                  `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\"`\n\tEmail      string                  `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tAddress    *Address                `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tCreditCard *payment.CreditCardInfo `protobuf:\"bytes,6,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckoutReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *CheckoutReq) GetCreditCard() *payment.CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       string `protobuf:\"bytes,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() string {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn \"\"\n}\n\ntype CheckoutResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId       string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tTransactionId string `protobuf:\"bytes,2,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *CheckoutResp) Reset() {\n\t*x = CheckoutResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutResp) ProtoMessage() {}\n\nfunc (x *CheckoutResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutResp.ProtoReflect.Descriptor instead.\nfunc (*CheckoutResp) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CheckoutResp) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_proto protoreflect.FileDescriptor\n\nvar file_checkout_proto_rawDesc = []byte{\n\t0x0a, 0x0e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x0d, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdd, 0x01, 0x0a, 0x0b, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65,\n\t0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,\n\t0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05,\n\t0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12,\n\t0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f,\n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,\n\t0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,\n\t0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79,\n\t0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x50, 0x0a, 0x0c, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,\n\t0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x4e, 0x0a,\n\t0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x3b, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x15, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_proto_rawDescOnce sync.Once\n\tfile_checkout_proto_rawDescData = file_checkout_proto_rawDesc\n)\n\nfunc file_checkout_proto_rawDescGZIP() []byte {\n\tfile_checkout_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_proto_rawDescData)\n\t})\n\treturn file_checkout_proto_rawDescData\n}\n\nvar file_checkout_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_checkout_proto_goTypes = []interface{}{\n\t(*CheckoutReq)(nil),            // 0: checkout.CheckoutReq\n\t(*Address)(nil),                // 1: checkout.Address\n\t(*CheckoutResp)(nil),           // 2: checkout.CheckoutResp\n\t(*payment.CreditCardInfo)(nil), // 3: payment.CreditCardInfo\n}\nvar file_checkout_proto_depIdxs = []int32{\n\t1, // 0: checkout.CheckoutReq.address:type_name -> checkout.Address\n\t3, // 1: checkout.CheckoutReq.credit_card:type_name -> payment.CreditCardInfo\n\t0, // 2: checkout.CheckoutService.Checkout:input_type -> checkout.CheckoutReq\n\t2, // 3: checkout.CheckoutService.Checkout:output_type -> checkout.CheckoutResp\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_proto_init() }\nfunc file_checkout_proto_init() {\n\tif File_checkout_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_proto = out.File\n\tfile_checkout_proto_rawDesc = nil\n\tfile_checkout_proto_goTypes = nil\n\tfile_checkout_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\ntype CheckoutService interface {\n\tCheckout(ctx context.Context, req *CheckoutReq) (res *CheckoutResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/checkout/checkoutservice/checkoutservice.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"Checkout\": kitex.NewMethodInfo(\n\t\tcheckoutHandler,\n\t\tnewCheckoutArgs,\n\t\tnewCheckoutResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tcheckoutServiceServiceInfo                = NewServiceInfo()\n\tcheckoutServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tcheckoutServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"CheckoutService\"\n\thandlerType := (*checkout.CheckoutService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"checkout\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc checkoutHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(checkout.CheckoutReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(checkout.CheckoutService).Checkout(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *CheckoutArgs:\n\t\tsuccess, err := handler.(checkout.CheckoutService).Checkout(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*CheckoutResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newCheckoutArgs() interface{} {\n\treturn &CheckoutArgs{}\n}\n\nfunc newCheckoutResult() interface{} {\n\treturn &CheckoutResult{}\n}\n\ntype CheckoutArgs struct {\n\tReq *checkout.CheckoutReq\n}\n\nfunc (p *CheckoutArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(checkout.CheckoutReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *CheckoutArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *CheckoutArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *CheckoutArgs) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar CheckoutArgs_Req_DEFAULT *checkout.CheckoutReq\n\nfunc (p *CheckoutArgs) GetReq() *checkout.CheckoutReq {\n\tif !p.IsSetReq() {\n\t\treturn CheckoutArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *CheckoutArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *CheckoutArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype CheckoutResult struct {\n\tSuccess *checkout.CheckoutResp\n}\n\nvar CheckoutResult_Success_DEFAULT *checkout.CheckoutResp\n\nfunc (p *CheckoutResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(checkout.CheckoutResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *CheckoutResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *CheckoutResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *CheckoutResult) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *CheckoutResult) GetSuccess() *checkout.CheckoutResp {\n\tif !p.IsSetSuccess() {\n\t\treturn CheckoutResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *CheckoutResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*checkout.CheckoutResp)\n}\n\nfunc (p *CheckoutResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *CheckoutResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq) (r *checkout.CheckoutResp, err error) {\n\tvar _args CheckoutArgs\n\t_args.Req = Req\n\tvar _result CheckoutResult\n\tif err = p.c.Call(ctx, \"Checkout\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/checkout/checkoutservice/client.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCheckoutServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCheckoutServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCheckoutServiceClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Checkout(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/checkout/checkoutservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler checkout.CheckoutService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/checkout/checkoutservice/server.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler checkout.CheckoutService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler checkout.CheckoutService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/payment/payment.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage payment\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CreditCardInfo) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CreditCardInfo[number], err)\n}\n\nfunc (x *CreditCardInfo) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardNumber, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardCvv, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationYear, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationMonth, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeReq[number], err)\n}\n\nfunc (x *ChargeReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Amount, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *ChargeReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeResp[number], err)\n}\n\nfunc (x *ChargeResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField1(buf []byte) (offset int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetCreditCardNumber())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetCreditCardCvv())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField3(buf []byte) (offset int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 3, x.GetCreditCardExpirationYear())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField4(buf []byte) (offset int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 4, x.GetCreditCardExpirationMonth())\n\treturn offset\n}\n\nfunc (x *ChargeReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Amount == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 1, x.GetAmount())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 4, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *ChargeResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField1() (n int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetCreditCardNumber())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField2() (n int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetCreditCardCvv())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField3() (n int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(3, x.GetCreditCardExpirationYear())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField4() (n int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(4, x.GetCreditCardExpirationMonth())\n\treturn n\n}\n\nfunc (x *ChargeReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField1() (n int) {\n\tif x.Amount == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(1, x.GetAmount())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField2() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField3() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField4() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(4, x.GetUserId())\n\treturn n\n}\n\nfunc (x *ChargeResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ChargeResp) sizeField1() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_CreditCardInfo = map[int32]string{\n\t1: \"CreditCardNumber\",\n\t2: \"CreditCardCvv\",\n\t3: \"CreditCardExpirationYear\",\n\t4: \"CreditCardExpirationMonth\",\n}\n\nvar fieldIDToName_ChargeReq = map[int32]string{\n\t1: \"Amount\",\n\t2: \"CreditCard\",\n\t3: \"OrderId\",\n\t4: \"UserId\",\n}\n\nvar fieldIDToName_ChargeResp = map[int32]string{\n\t1: \"TransactionId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/payment/payment.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: payment.proto\n\npackage payment\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CreditCardInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCreditCardNumber          string `protobuf:\"bytes,1,opt,name=credit_card_number,json=creditCardNumber,proto3\" json:\"credit_card_number,omitempty\"`\n\tCreditCardCvv             int32  `protobuf:\"varint,2,opt,name=credit_card_cvv,json=creditCardCvv,proto3\" json:\"credit_card_cvv,omitempty\"`\n\tCreditCardExpirationYear  int32  `protobuf:\"varint,3,opt,name=credit_card_expiration_year,json=creditCardExpirationYear,proto3\" json:\"credit_card_expiration_year,omitempty\"`\n\tCreditCardExpirationMonth int32  `protobuf:\"varint,4,opt,name=credit_card_expiration_month,json=creditCardExpirationMonth,proto3\" json:\"credit_card_expiration_month,omitempty\"`\n}\n\nfunc (x *CreditCardInfo) Reset() {\n\t*x = CreditCardInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreditCardInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreditCardInfo) ProtoMessage() {}\n\nfunc (x *CreditCardInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreditCardInfo.ProtoReflect.Descriptor instead.\nfunc (*CreditCardInfo) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreditCardInfo) GetCreditCardNumber() string {\n\tif x != nil {\n\t\treturn x.CreditCardNumber\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreditCardInfo) GetCreditCardCvv() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardCvv\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationMonth\n\t}\n\treturn 0\n}\n\ntype ChargeReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAmount     float32         `protobuf:\"fixed32,1,opt,name=amount,proto3\" json:\"amount,omitempty\"`\n\tCreditCard *CreditCardInfo `protobuf:\"bytes,2,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n\tOrderId    string          `protobuf:\"bytes,3,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId     uint32          `protobuf:\"varint,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ChargeReq) Reset() {\n\t*x = ChargeReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeReq) ProtoMessage() {}\n\nfunc (x *ChargeReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeReq.ProtoReflect.Descriptor instead.\nfunc (*ChargeReq) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ChargeReq) GetAmount() float32 {\n\tif x != nil {\n\t\treturn x.Amount\n\t}\n\treturn 0\n}\n\nfunc (x *ChargeReq) GetCreditCard() *CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\nfunc (x *ChargeReq) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *ChargeReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype ChargeResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTransactionId string `protobuf:\"bytes,1,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *ChargeResp) Reset() {\n\t*x = ChargeResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeResp) ProtoMessage() {}\n\nfunc (x *ChargeResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeResp.ProtoReflect.Descriptor instead.\nfunc (*ChargeResp) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ChargeResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_payment_proto protoreflect.FileDescriptor\n\nvar file_payment_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x12, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65,\n\t0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43,\n\t0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x76, 0x76, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x43, 0x76,\n\t0x76, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61, 0x72,\n\t0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f,\n\t0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x6e, 0x74,\n\t0x68, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12,\n\t0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52,\n\t0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69,\n\t0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,\n\t0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,\n\t0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75,\n\t0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61,\n\t0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x45, 0x0a, 0x0e, 0x50, 0x61,\n\t0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x06,\n\t0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x61, 0x79,\n\t0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_payment_proto_rawDescOnce sync.Once\n\tfile_payment_proto_rawDescData = file_payment_proto_rawDesc\n)\n\nfunc file_payment_proto_rawDescGZIP() []byte {\n\tfile_payment_proto_rawDescOnce.Do(func() {\n\t\tfile_payment_proto_rawDescData = protoimpl.X.CompressGZIP(file_payment_proto_rawDescData)\n\t})\n\treturn file_payment_proto_rawDescData\n}\n\nvar file_payment_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_payment_proto_goTypes = []interface{}{\n\t(*CreditCardInfo)(nil), // 0: payment.CreditCardInfo\n\t(*ChargeReq)(nil),      // 1: payment.ChargeReq\n\t(*ChargeResp)(nil),     // 2: payment.ChargeResp\n}\nvar file_payment_proto_depIdxs = []int32{\n\t0, // 0: payment.ChargeReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 1: payment.PaymentService.Charge:input_type -> payment.ChargeReq\n\t2, // 2: payment.PaymentService.Charge:output_type -> payment.ChargeResp\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_payment_proto_init() }\nfunc file_payment_proto_init() {\n\tif File_payment_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_payment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreditCardInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_payment_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_payment_proto_goTypes,\n\t\tDependencyIndexes: file_payment_proto_depIdxs,\n\t\tMessageInfos:      file_payment_proto_msgTypes,\n\t}.Build()\n\tFile_payment_proto = out.File\n\tfile_payment_proto_rawDesc = nil\n\tfile_payment_proto_goTypes = nil\n\tfile_payment_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\ntype PaymentService interface {\n\tCharge(ctx context.Context, req *ChargeReq) (res *ChargeResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/payment/paymentservice/client.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kPaymentServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kPaymentServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kPaymentServiceClient) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Charge(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/payment/paymentservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler payment.PaymentService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/payment/paymentservice/paymentservice.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"Charge\": kitex.NewMethodInfo(\n\t\tchargeHandler,\n\t\tnewChargeArgs,\n\t\tnewChargeResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tpaymentServiceServiceInfo                = NewServiceInfo()\n\tpaymentServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tpaymentServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"PaymentService\"\n\thandlerType := (*payment.PaymentService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"payment\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc chargeHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(payment.ChargeReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(payment.PaymentService).Charge(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *ChargeArgs:\n\t\tsuccess, err := handler.(payment.PaymentService).Charge(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ChargeResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newChargeArgs() interface{} {\n\treturn &ChargeArgs{}\n}\n\nfunc newChargeResult() interface{} {\n\treturn &ChargeResult{}\n}\n\ntype ChargeArgs struct {\n\tReq *payment.ChargeReq\n}\n\nfunc (p *ChargeArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(payment.ChargeReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ChargeArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ChargeArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ChargeArgs) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ChargeArgs_Req_DEFAULT *payment.ChargeReq\n\nfunc (p *ChargeArgs) GetReq() *payment.ChargeReq {\n\tif !p.IsSetReq() {\n\t\treturn ChargeArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ChargeArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ChargeArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ChargeResult struct {\n\tSuccess *payment.ChargeResp\n}\n\nvar ChargeResult_Success_DEFAULT *payment.ChargeResp\n\nfunc (p *ChargeResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(payment.ChargeResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ChargeResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ChargeResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ChargeResult) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ChargeResult) GetSuccess() *payment.ChargeResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ChargeResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ChargeResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*payment.ChargeResp)\n}\n\nfunc (p *ChargeResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ChargeResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Charge(ctx context.Context, Req *payment.ChargeReq) (r *payment.ChargeResp, err error) {\n\tvar _args ChargeArgs\n\t_args.Req = Req\n\tvar _result ChargeResult\n\tif err = p.c.Call(ctx, \"Charge\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/payment/paymentservice/server.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler payment.PaymentService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler payment.PaymentService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/product/product.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *ListProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsReq[number], err)\n}\n\nfunc (x *ListProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Page, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.PageSize, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CategoryName, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Product[number], err)\n}\n\nfunc (x *Product) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Name, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Description, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Picture, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Price, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v string\n\tv, offset, err = fastpb.ReadString(buf, _type)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Categories = append(x.Categories, v)\n\treturn offset, err\n}\n\nfunc (x *ListProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsResp[number], err)\n}\n\nfunc (x *ListProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Products = append(x.Products, &v)\n\treturn offset, nil\n}\n\nfunc (x *GetProductReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductReq[number], err)\n}\n\nfunc (x *GetProductReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetProductResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductResp[number], err)\n}\n\nfunc (x *GetProductResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Product = &v\n\treturn offset, nil\n}\n\nfunc (x *SearchProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsReq[number], err)\n}\n\nfunc (x *SearchProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Query, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *SearchProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsResp[number], err)\n}\n\nfunc (x *SearchProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Results = append(x.Results, &v)\n\treturn offset, nil\n}\n\nfunc (x *ListProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Page == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetPage())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.PageSize == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetPageSize())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.CategoryName == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetCategoryName())\n\treturn offset\n}\n\nfunc (x *Product) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField2(buf []byte) (offset int) {\n\tif x.Name == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetName())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField3(buf []byte) (offset int) {\n\tif x.Description == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetDescription())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField4(buf []byte) (offset int) {\n\tif x.Picture == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetPicture())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField5(buf []byte) (offset int) {\n\tif x.Price == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 5, x.GetPrice())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField6(buf []byte) (offset int) {\n\tif len(x.Categories) == 0 {\n\t\treturn offset\n\t}\n\tfor i := range x.GetCategories() {\n\t\toffset += fastpb.WriteString(buf[offset:], 6, x.GetCategories()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Products == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetProducts() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProducts()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *GetProductReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *GetProductResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Product == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProduct())\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Query == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetQuery())\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Results == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetResults() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetResults()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField1() (n int) {\n\tif x.Page == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetPage())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField2() (n int) {\n\tif x.PageSize == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetPageSize())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField3() (n int) {\n\tif x.CategoryName == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetCategoryName())\n\treturn n\n}\n\nfunc (x *Product) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Product) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *Product) sizeField2() (n int) {\n\tif x.Name == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetName())\n\treturn n\n}\n\nfunc (x *Product) sizeField3() (n int) {\n\tif x.Description == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetDescription())\n\treturn n\n}\n\nfunc (x *Product) sizeField4() (n int) {\n\tif x.Picture == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetPicture())\n\treturn n\n}\n\nfunc (x *Product) sizeField5() (n int) {\n\tif x.Price == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(5, x.GetPrice())\n\treturn n\n}\n\nfunc (x *Product) sizeField6() (n int) {\n\tif len(x.Categories) == 0 {\n\t\treturn n\n\t}\n\tfor i := range x.GetCategories() {\n\t\tn += fastpb.SizeString(6, x.GetCategories()[i])\n\t}\n\treturn n\n}\n\nfunc (x *ListProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListProductsResp) sizeField1() (n int) {\n\tif x.Products == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetProducts() {\n\t\tn += fastpb.SizeMessage(1, x.GetProducts()[i])\n\t}\n\treturn n\n}\n\nfunc (x *GetProductReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductReq) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *GetProductResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductResp) sizeField1() (n int) {\n\tif x.Product == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetProduct())\n\treturn n\n}\n\nfunc (x *SearchProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsReq) sizeField1() (n int) {\n\tif x.Query == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetQuery())\n\treturn n\n}\n\nfunc (x *SearchProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsResp) sizeField1() (n int) {\n\tif x.Results == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetResults() {\n\t\tn += fastpb.SizeMessage(1, x.GetResults()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_ListProductsReq = map[int32]string{\n\t1: \"Page\",\n\t2: \"PageSize\",\n\t3: \"CategoryName\",\n}\n\nvar fieldIDToName_Product = map[int32]string{\n\t1: \"Id\",\n\t2: \"Name\",\n\t3: \"Description\",\n\t4: \"Picture\",\n\t5: \"Price\",\n\t6: \"Categories\",\n}\n\nvar fieldIDToName_ListProductsResp = map[int32]string{\n\t1: \"Products\",\n}\n\nvar fieldIDToName_GetProductReq = map[int32]string{\n\t1: \"Id\",\n}\n\nvar fieldIDToName_GetProductResp = map[int32]string{\n\t1: \"Product\",\n}\n\nvar fieldIDToName_SearchProductsReq = map[int32]string{\n\t1: \"Query\",\n}\n\nvar fieldIDToName_SearchProductsResp = map[int32]string{\n\t1: \"Results\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/product/product.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: product.proto\n\npackage product\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPage         int32  `protobuf:\"varint,1,opt,name=page,proto3\" json:\"page,omitempty\"`\n\tPageSize     int32  `protobuf:\"varint,2,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\tCategoryName string `protobuf:\"bytes,3,opt,name=category_name,json=categoryName,proto3\" json:\"category_name,omitempty\"`\n}\n\nfunc (x *ListProductsReq) Reset() {\n\t*x = ListProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsReq) ProtoMessage() {}\n\nfunc (x *ListProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsReq.ProtoReflect.Descriptor instead.\nfunc (*ListProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListProductsReq) GetPage() int32 {\n\tif x != nil {\n\t\treturn x.Page\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetCategoryName() string {\n\tif x != nil {\n\t\treturn x.CategoryName\n\t}\n\treturn \"\"\n}\n\ntype Product struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          uint32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string   `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tPicture     string   `protobuf:\"bytes,4,opt,name=picture,proto3\" json:\"picture,omitempty\"`\n\tPrice       float32  `protobuf:\"fixed32,5,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tCategories  []string `protobuf:\"bytes,6,rep,name=categories,proto3\" json:\"categories,omitempty\"`\n}\n\nfunc (x *Product) Reset() {\n\t*x = Product{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Product) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Product) ProtoMessage() {}\n\nfunc (x *Product) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Product.ProtoReflect.Descriptor instead.\nfunc (*Product) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Product) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPicture() string {\n\tif x != nil {\n\t\treturn x.Picture\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPrice() float32 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetCategories() []string {\n\tif x != nil {\n\t\treturn x.Categories\n\t}\n\treturn nil\n}\n\ntype ListProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProducts []*Product `protobuf:\"bytes,1,rep,name=products,proto3\" json:\"products,omitempty\"`\n}\n\nfunc (x *ListProductsResp) Reset() {\n\t*x = ListProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsResp) ProtoMessage() {}\n\nfunc (x *ListProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsResp.ProtoReflect.Descriptor instead.\nfunc (*ListProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListProductsResp) GetProducts() []*Product {\n\tif x != nil {\n\t\treturn x.Products\n\t}\n\treturn nil\n}\n\ntype GetProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetProductReq) Reset() {\n\t*x = GetProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductReq) ProtoMessage() {}\n\nfunc (x *GetProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductReq.ProtoReflect.Descriptor instead.\nfunc (*GetProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetProductResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProduct *Product `protobuf:\"bytes,1,opt,name=product,proto3\" json:\"product,omitempty\"`\n}\n\nfunc (x *GetProductResp) Reset() {\n\t*x = GetProductResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductResp) ProtoMessage() {}\n\nfunc (x *GetProductResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductResp.ProtoReflect.Descriptor instead.\nfunc (*GetProductResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetProductResp) GetProduct() *Product {\n\tif x != nil {\n\t\treturn x.Product\n\t}\n\treturn nil\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *SearchProductsReq) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\ntype SearchProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*Product `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *SearchProductsResp) Reset() {\n\t*x = SearchProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsResp) ProtoMessage() {}\n\nfunc (x *SearchProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsResp.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SearchProductsResp) GetResults() []*Product {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_product_proto protoreflect.FileDescriptor\n\nvar file_product_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x67, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12,\n\t0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d,\n\t0x65, 0x22, 0x9f, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a,\n\t0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72,\n\t0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65,\n\t0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,\n\t0x69, 0x65, 0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65,\n\t0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22,\n\t0x40, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,\n\t0x73, 0x32, 0xec, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x61, 0x74,\n\t0x61, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x4c,\n\t0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e,\n\t0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73,\n\t0x70, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e,\n\t0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65,\n\t0x71, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72,\n\t0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63,\n\t0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d,\n\t0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_proto_rawDescOnce sync.Once\n\tfile_product_proto_rawDescData = file_product_proto_rawDesc\n)\n\nfunc file_product_proto_rawDescGZIP() []byte {\n\tfile_product_proto_rawDescOnce.Do(func() {\n\t\tfile_product_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_proto_rawDescData)\n\t})\n\treturn file_product_proto_rawDescData\n}\n\nvar file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_product_proto_goTypes = []interface{}{\n\t(*ListProductsReq)(nil),    // 0: product.ListProductsReq\n\t(*Product)(nil),            // 1: product.Product\n\t(*ListProductsResp)(nil),   // 2: product.ListProductsResp\n\t(*GetProductReq)(nil),      // 3: product.GetProductReq\n\t(*GetProductResp)(nil),     // 4: product.GetProductResp\n\t(*SearchProductsReq)(nil),  // 5: product.SearchProductsReq\n\t(*SearchProductsResp)(nil), // 6: product.SearchProductsResp\n}\nvar file_product_proto_depIdxs = []int32{\n\t1, // 0: product.ListProductsResp.products:type_name -> product.Product\n\t1, // 1: product.GetProductResp.product:type_name -> product.Product\n\t1, // 2: product.SearchProductsResp.results:type_name -> product.Product\n\t0, // 3: product.ProductCatalogService.ListProducts:input_type -> product.ListProductsReq\n\t3, // 4: product.ProductCatalogService.GetProduct:input_type -> product.GetProductReq\n\t5, // 5: product.ProductCatalogService.SearchProducts:input_type -> product.SearchProductsReq\n\t2, // 6: product.ProductCatalogService.ListProducts:output_type -> product.ListProductsResp\n\t4, // 7: product.ProductCatalogService.GetProduct:output_type -> product.GetProductResp\n\t6, // 8: product.ProductCatalogService.SearchProducts:output_type -> product.SearchProductsResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_product_proto_init() }\nfunc file_product_proto_init() {\n\tif File_product_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Product); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_proto_goTypes,\n\t\tDependencyIndexes: file_product_proto_depIdxs,\n\t\tMessageInfos:      file_product_proto_msgTypes,\n\t}.Build()\n\tFile_product_proto = out.File\n\tfile_product_proto_rawDesc = nil\n\tfile_product_proto_goTypes = nil\n\tfile_product_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\ntype ProductCatalogService interface {\n\tListProducts(ctx context.Context, req *ListProductsReq) (res *ListProductsResp, err error)\n\tGetProduct(ctx context.Context, req *GetProductReq) (res *GetProductResp, err error)\n\tSearchProducts(ctx context.Context, req *SearchProductsReq) (res *SearchProductsResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/product/productcatalogservice/client.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductCatalogServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductCatalogServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductCatalogServiceClient) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.SearchProducts(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/product/productcatalogservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductCatalogService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/product/productcatalogservice/productcatalogservice.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"ListProducts\": kitex.NewMethodInfo(\n\t\tlistProductsHandler,\n\t\tnewListProductsArgs,\n\t\tnewListProductsResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"GetProduct\": kitex.NewMethodInfo(\n\t\tgetProductHandler,\n\t\tnewGetProductArgs,\n\t\tnewGetProductResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"SearchProducts\": kitex.NewMethodInfo(\n\t\tsearchProductsHandler,\n\t\tnewSearchProductsArgs,\n\t\tnewSearchProductsResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tproductCatalogServiceServiceInfo                = NewServiceInfo()\n\tproductCatalogServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tproductCatalogServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"ProductCatalogService\"\n\thandlerType := (*product.ProductCatalogService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"product\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.ListProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).ListProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *ListProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).ListProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListProductsResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newListProductsArgs() interface{} {\n\treturn &ListProductsArgs{}\n}\n\nfunc newListProductsResult() interface{} {\n\treturn &ListProductsResult{}\n}\n\ntype ListProductsArgs struct {\n\tReq *product.ListProductsReq\n}\n\nfunc (p *ListProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.ListProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListProductsArgs_Req_DEFAULT *product.ListProductsReq\n\nfunc (p *ListProductsArgs) GetReq() *product.ListProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn ListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListProductsResult struct {\n\tSuccess *product.ListProductsResp\n}\n\nvar ListProductsResult_Success_DEFAULT *product.ListProductsResp\n\nfunc (p *ListProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.ListProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListProductsResult) GetSuccess() *product.ListProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.ListProductsResp)\n}\n\nfunc (p *ListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.GetProductReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).GetProduct(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *GetProductArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).GetProduct(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetProductResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newGetProductArgs() interface{} {\n\treturn &GetProductArgs{}\n}\n\nfunc newGetProductResult() interface{} {\n\treturn &GetProductResult{}\n}\n\ntype GetProductArgs struct {\n\tReq *product.GetProductReq\n}\n\nfunc (p *GetProductArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.GetProductReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetProductArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetProductArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetProductArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetProductArgs_Req_DEFAULT *product.GetProductReq\n\nfunc (p *GetProductArgs) GetReq() *product.GetProductReq {\n\tif !p.IsSetReq() {\n\t\treturn GetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetProductResult struct {\n\tSuccess *product.GetProductResp\n}\n\nvar GetProductResult_Success_DEFAULT *product.GetProductResp\n\nfunc (p *GetProductResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.GetProductResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetProductResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetProductResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetProductResult) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetProductResult) GetSuccess() *product.GetProductResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.GetProductResp)\n}\n\nfunc (p *GetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc searchProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.SearchProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).SearchProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *SearchProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).SearchProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SearchProductsResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newSearchProductsArgs() interface{} {\n\treturn &SearchProductsArgs{}\n}\n\nfunc newSearchProductsResult() interface{} {\n\treturn &SearchProductsResult{}\n}\n\ntype SearchProductsArgs struct {\n\tReq *product.SearchProductsReq\n}\n\nfunc (p *SearchProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.SearchProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SearchProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SearchProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SearchProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SearchProductsArgs_Req_DEFAULT *product.SearchProductsReq\n\nfunc (p *SearchProductsArgs) GetReq() *product.SearchProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn SearchProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SearchProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SearchProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SearchProductsResult struct {\n\tSuccess *product.SearchProductsResp\n}\n\nvar SearchProductsResult_Success_DEFAULT *product.SearchProductsResp\n\nfunc (p *SearchProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.SearchProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SearchProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SearchProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SearchProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SearchProductsResult) GetSuccess() *product.SearchProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SearchProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SearchProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.SearchProductsResp)\n}\n\nfunc (p *SearchProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SearchProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, Req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args ListProductsArgs\n\t_args.Req = Req\n\tvar _result ListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, Req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args GetProductArgs\n\t_args.Req = Req\n\tvar _result GetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq) (r *product.SearchProductsResp, err error) {\n\tvar _args SearchProductsArgs\n\t_args.Req = Req\n\tvar _result SearchProductsResult\n\tif err = p.c.Call(ctx, \"SearchProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/product/productcatalogservice/server.go",
    "content": "// Code generated by Kitex v0.9.0. DO NOT EDIT.\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductCatalogService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler product.ProductCatalogService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.PasswordConfirm, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetPasswordConfirm())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetPasswordConfirm())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"PasswordConfirm\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Register\": kitex.NewMethodInfo(registerHandler, newRegisterArgs, newRegisterResult, false),\n\t\t\"Login\":    kitex.NewMethodInfo(loginHandler, newLoginArgs, newLoginResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"user\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/cart/cart_client.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() cartservice.Client\n\tService() string\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := cartservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient cartservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() cartservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\treturn c.kitexClient.AddItem(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\treturn c.kitexClient.GetCart(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\treturn c.kitexClient.EmptyCart(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/cart/cart_default.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc AddItem(ctx context.Context, req *cart.AddItemReq, callOptions ...callopt.Option) (resp *cart.AddItemResp, err error) {\n\tresp, err = defaultClient.AddItem(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"AddItem call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetCart(ctx context.Context, req *cart.GetCartReq, callOptions ...callopt.Option) (resp *cart.GetCartResp, err error) {\n\tresp, err = defaultClient.GetCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc EmptyCart(ctx context.Context, req *cart.EmptyCartReq, callOptions ...callopt.Option) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = defaultClient.EmptyCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"EmptyCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/cart/cart_init.go",
    "content": "package cart\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"cart\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/checkout/checkout_client.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() checkoutservice.Client\n\tService() string\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := checkoutservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient checkoutservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() checkoutservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\treturn c.kitexClient.Checkout(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/checkout/checkout_default.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Checkout(ctx context.Context, req *checkout.CheckoutReq, callOptions ...callopt.Option) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = defaultClient.Checkout(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Checkout call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/checkout/checkout_init.go",
    "content": "package checkout\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"checkout\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/payment/payment_client.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() paymentservice.Client\n\tService() string\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := paymentservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient paymentservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() paymentservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\treturn c.kitexClient.Charge(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/payment/payment_default.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Charge(ctx context.Context, req *payment.ChargeReq, callOptions ...callopt.Option) (resp *payment.ChargeResp, err error) {\n\tresp, err = defaultClient.Charge(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Charge call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/payment/payment_init.go",
    "content": "package payment\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"payment\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/product/product_client.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() productcatalogservice.Client\n\tService() string\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := productcatalogservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient productcatalogservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() productcatalogservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\treturn c.kitexClient.ListProducts(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\treturn c.kitexClient.GetProduct(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\treturn c.kitexClient.SearchProducts(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/product/product_default.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (resp *product.ListProductsResp, err error) {\n\tresp, err = defaultClient.ListProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (resp *product.GetProductResp, err error) {\n\tresp, err = defaultClient.GetProduct(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetProduct call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc SearchProducts(ctx context.Context, req *product.SearchProductsReq, callOptions ...callopt.Option) (resp *product.SearchProductsResp, err error) {\n\tresp, err = defaultClient.SearchProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"SearchProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/product/product_init.go",
    "content": "package product\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"product\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch12/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/.gitignore",
    "content": "app/*/log\napp/*/tmp\napp/*/.env\ngo.work.sum"
  },
  {
    "path": "gomall/tutorial/ch13/Makefile",
    "content": "export ROOT_MOD=github.com/cloudwego/biz-demo/gomall\n.PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module ${ROOT_MOD}/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module  ${ROOT_MOD}/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module ${ROOT_MOD}/app/frontend --idl ../../idl/frontend/order_page.proto\n\n.PHONY: gen-user\ngen-user: \n\t@cd rpc_gen && cwgo client --type RPC --service user --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/user.proto\n\t@cd app/user && cwgo server --type RPC --service user --module ${ROOT_MOD}/app/user --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/user.proto\n\n.PHONY: gen-product\ngen-product: \n\t@cd rpc_gen && cwgo client --type RPC --service product --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/product.proto\n\t@cd app/product && cwgo server --type RPC --service product --module ${ROOT_MOD}/app/product --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/product.proto\n\n.PHONY: gen-cart\ngen-cart: \n\t@cd rpc_gen && cwgo client --type RPC --service cart --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/cart.proto\n\t@cd app/cart && cwgo server --type RPC --service cart --module ${ROOT_MOD}/app/cart --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/cart.proto\n\n.PHONY: gen-payment\ngen-payment: \n\t@cd rpc_gen && cwgo client --type RPC --service payment --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/payment.proto\n\t@cd app/payment && cwgo server --type RPC --service payment --module ${ROOT_MOD}/app/payment --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/payment.proto\n\n.PHONY: gen-checkout\ngen-checkout: \n\t@cd rpc_gen && cwgo client --type RPC --service checkout --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/checkout.proto\n\t@cd app/checkout && cwgo server --type RPC --service checkout --module ${ROOT_MOD}/app/checkout --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/checkout.proto\n\n.PHONY: gen-order\ngen-order: \n\t@cd rpc_gen && cwgo client --type RPC --service order --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/order.proto\n\t@cd app/order && cwgo server --type RPC --service order --module ${ROOT_MOD}/app/order --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/order.proto"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t//redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\t//nolint:errcheck\n\t\tDB.AutoMigrate(\n\t\t\t&model.Cart{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/model/cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Cart struct {\n\tgorm.Model\n\tUserId    uint32 `gorm:\"type:int(11);not null;index:idx_user_id\"`\n\tProductId uint32 `gorm:\"type:int(11);not null;\"`\n\tQty       uint32 `gorm:\"type:int(11);not null;\"`\n}\n\nfunc (Cart) TableName() string {\n\treturn \"cart\"\n}\n\nfunc AddItem(ctx context.Context, db *gorm.DB, item *Cart) error {\n\tvar row Cart\n\terr := db.WithContext(ctx).\n\t\tModel(&Cart{}).\n\t\tWhere(&Cart{UserId: item.UserId, ProductId: item.ProductId}).\n\t\tFirst(&row).Error\n\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\treturn err\n\t}\n\tif row.ID > 0 {\n\t\treturn db.WithContext(ctx).\n\t\t\tModel(&Cart{}).\n\t\t\tWhere(&Cart{UserId: item.UserId, ProductId: item.ProductId}).\n\t\t\tUpdateColumn(\"qty\", gorm.Expr(\"qty+?\", item.Qty)).Error\n\t}\n\n\treturn db.WithContext(ctx).Create(item).Error\n}\n\nfunc EmptyCart(ctx context.Context, db *gorm.DB, userId uint32) error {\n\tif userId == 0 {\n\t\treturn errors.New(\"user id is required\")\n\t}\n\treturn db.WithContext(ctx).Delete(&Cart{}, \"user_id = ?\", userId).Error\n}\n\nfunc GetCartByUserId(ctx context.Context, db *gorm.DB, userId uint32) ([]*Cart, error) {\n\tvar rows []*Cart\n\terr := db.WithContext(ctx).\n\t\tModel(&Cart{}).\n\t\tWhere(&Cart{UserId: userId}).\n\t\tFind(&rows).Error\n\treturn rows, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/service/add_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/rpc\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype AddItemService struct {\n\tctx context.Context\n} // NewAddItemService new AddItemService\nfunc NewAddItemService(ctx context.Context) *AddItemService {\n\treturn &AddItemService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *AddItemService) Run(req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\t// Finish your business logic.\n\tproductResp, err := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: req.Item.ProductId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif productResp == nil || productResp.Product.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40004, \"product not found\")\n\t}\n\n\tcartItem := &model.Cart{\n\t\tUserId:    req.UserId,\n\t\tProductId: req.Item.ProductId,\n\t\tQty:       req.Item.Quantity,\n\t}\n\n\terr = model.AddItem(s.ctx, mysql.DB, cartItem)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\n\treturn &cart.AddItemResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/service/add_item_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\nfunc TestAddItem_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewAddItemService(ctx)\n\t// init req and assert value\n\n\treq := &cart.AddItemReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/service/empty_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype EmptyCartService struct {\n\tctx context.Context\n} // NewEmptyCartService new EmptyCartService\nfunc NewEmptyCartService(ctx context.Context) *EmptyCartService {\n\treturn &EmptyCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EmptyCartService) Run(req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\t// Finish your business logic.\n\terr = model.EmptyCart(s.ctx, mysql.DB, req.UserId)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50001, err.Error())\n\t}\n\treturn &cart.EmptyCartResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/service/empty_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\nfunc TestEmptyCart_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEmptyCartService(ctx)\n\t// init req and assert value\n\n\treq := &cart.EmptyCartReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetCartService struct {\n\tctx context.Context\n} // NewGetCartService new GetCartService\nfunc NewGetCartService(ctx context.Context) *GetCartService {\n\treturn &GetCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetCartService) Run(req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\t// Finish your business logic.\n\tlist, err := model.GetCartByUserId(s.ctx, mysql.DB, req.UserId)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50002, err.Error())\n\t}\n\tvar items []*cart.CartItem\n\tfor _, item := range list {\n\t\titems = append(items, &cart.CartItem{\n\t\t\tProductId: item.ProductId,\n\t\t\tQuantity:  item.Qty,\n\t\t})\n\t}\n\treturn &cart.GetCartResp{Items: items}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/biz/service/get_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\nfunc TestGetCart_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewGetCartService(ctx)\n\t// init req and assert value\n\n\treq := &cart.GetCartReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cart\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/cart?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/cart?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/cart?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/cart\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/go-version v1.6.0 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.34.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/service\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\n// CartServiceImpl implements the last service interface defined in the IDL.\ntype CartServiceImpl struct{}\n\n// AddItem implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) AddItem(ctx context.Context, req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\tresp, err = service.NewAddItemService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) GetCart(ctx context.Context, req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\tresp, err = service.NewGetCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// EmptyCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) EmptyCart(ctx context.Context, req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = service.NewEmptyCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'cart'\n  ToolVersion: 'v0.9.1'\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\trpc.InitClient()\n\n\topts := kitexInit()\n\tsvr := cartservice.NewServer(new(CartServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}), server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\tcartutils \"github.com/cloudwego/biz-demo/gomall/app/cart/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tProductClient productcatalogservice.Client\n\tonce          sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitProductClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcartutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcartutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/cart\"\nexec \"$CURDIR/bin/cart\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/cart/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype CheckoutService struct {\n\tctx context.Context\n} // NewCheckoutService new CheckoutService\nfunc NewCheckoutService(ctx context.Context) *CheckoutService {\n\treturn &CheckoutService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *CheckoutService) Run(req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\t// Finish your business logic.\n\tcartResult, err := rpc.CartClient.GetCart(s.ctx, &cart.GetCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(5005001, err.Error())\n\t}\n\tif cartResult == nil || cartResult.Items == nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(5004001, \"cart is empty\")\n\t}\n\n\tvar (\n\t\ttotal float32\n\t\toi    []*order.OrderItem\n\t)\n\n\tfor _, cartItem := range cartResult.Items {\n\t\tproductResp, resultErr := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{\n\t\t\tId: cartItem.ProductId,\n\t\t})\n\n\t\tif resultErr != nil {\n\t\t\treturn nil, resultErr\n\t\t}\n\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tp := productResp.Product.Price\n\n\t\tcost := p * float32(cartItem.Quantity)\n\t\ttotal += cost\n\n\t\toi = append(oi, &order.OrderItem{\n\t\t\tItem: &cart.CartItem{\n\t\t\t\tProductId: cartItem.ProductId,\n\t\t\t\tQuantity:  cartItem.Quantity,\n\t\t\t},\n\t\t\tCost: cost,\n\t\t})\n\t}\n\n\tvar orderId string\n\n\torderResp, err := rpc.OrderClient.PlaceOrder(s.ctx, &order.PlaceOrderReq{\n\t\tUserId: req.UserId,\n\t\tEmail:  req.Email,\n\t\tAddress: &order.Address{\n\t\t\tStreetAddress: req.Address.StreetAddress,\n\t\t\tCity:          req.Address.City,\n\t\t\tState:         req.Address.State,\n\t\t\tCountry:       req.Address.Country,\n\t\t\tZipCode:       req.Address.ZipCode,\n\t\t},\n\t\tItems: oi,\n\t})\n\tif err != nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(5004002, err.Error())\n\t}\n\n\tif orderResp != nil && orderResp.Order != nil {\n\t\torderId = orderResp.Order.OrderId\n\t}\n\n\tpayReq := &payment.ChargeReq{\n\t\tUserId:  req.UserId,\n\t\tOrderId: orderId,\n\t\tAmount:  total,\n\t\tCreditCard: &payment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CreditCard.CreditCardNumber,\n\t\t\tCreditCardCvv:             req.CreditCard.CreditCardCvv,\n\t\t\tCreditCardExpirationMonth: req.CreditCard.CreditCardExpirationMonth,\n\t\t\tCreditCardExpirationYear:  req.CreditCard.CreditCardExpirationYear,\n\t\t},\n\t}\n\n\t_, err = rpc.CartClient.EmptyCart(s.ctx, &cart.EmptyCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n\n\tpaymentResult, err := rpc.PaymentClient.Charge(s.ctx, payReq)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tklog.Info(paymentResult)\n\n\tresp = &checkout.CheckoutResp{\n\t\tOrderId:       orderId,\n\t\tTransactionId: paymentResult.TransactionId,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/biz/service/checkout_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"testing\"\n)\n\nfunc TestCheckout_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewCheckoutService(ctx)\n\t// init req and assert value\n\n\treq := &checkout.CheckoutReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"checkout\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8885\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8885\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8885\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/checkout\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.2\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca h1:TE5KFwos5Gxn1IHdwW05E98wZ/nM9efZe12D8h5eunA=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca/go.mod h1:0miM9JonVZc9rPFBnCJpeoPiANNzT9ZfbJR3hDlXu14=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.2 h1:L0L3fcSNReTRGyZ6AqAEN0K56wYeYAwapBIhkvh0f3E=\ngithub.com/redis/go-redis/v9 v9.5.2/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/service\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n)\n\n// CheckoutServiceImpl implements the last service interface defined in the IDL.\ntype CheckoutServiceImpl struct{}\n\n// Checkout implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) Checkout(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tCartClient    cartservice.Client\n\tProductClient productcatalogservice.Client\n\tPaymentClient paymentservice.Client\n\tOrderClient   orderservice.Client\n\tonce          sync.Once\n\terr           error\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitCartClient()\n\t\tinitProductClient()\n\t\tinitPaymentClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initPaymentClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\tPaymentClient, err = paymentservice.NewClient(\"payment\", opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'checkout'\n  ToolVersion: 'v0.9.1'\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\trpc.InitClient()\n\n\tsvr := checkoutservice.NewServer(new(CheckoutServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr), server.WithRegistry(r))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/checkout/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/checkout\"\nexec \"$CURDIR/bin/checkout\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.8.1\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusOK, []byte(redirect))\n}\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusOK, []byte(\"/\"))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusOK, []byte(\"/\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/cart/cart_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetCart .\n// @router /cart [GET]\nfunc GetCart(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetCartService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, resp))\n}\n\n// AddCartItem .\n// @router /cart [POST]\nfunc AddCartItem(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req cart.AddCartItemReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewAddCartItemService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/cart\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/cart/cart_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetCart(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/cart\", GetCart)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestAddCartItem(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/cart\", AddCartItem)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/category/category_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Category .\n// @router /category/:category [GET]\nfunc Category(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req category.CategoryReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewCategoryService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"category\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/category/category_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCategory(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/category/:category\", Category)\n\tpath := \"/category/:category\"                             // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/checkout/checkout_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Checkout .\n// @router /checkout [GET]\nfunc Checkout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutWaiting .\n// @router /checkout/waiting [POST]\nfunc CheckoutWaiting(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutWaitingService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutResult .\n// @router /checkout/result [GET]\nfunc CheckoutResult(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutResultService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"result\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/checkout/checkout_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCheckout(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout\", Checkout)\n\tpath := \"/checkout\"                                       // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutWaiting(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/checkout/waiting\", CheckoutWaiting)\n\tpath := \"/checkout/waiting\"                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutResult(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout/result\", CheckoutResult)\n\tpath := \"/checkout/result\"                                // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/order/order_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// OrderList .\n// @router /order [GET]\nfunc OrderList(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewOrderListService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"order\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/order/order_service_test.go",
    "content": "package order\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestOrderList(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/order\", OrderList)\n\tpath := \"/order\"                                          // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/product/product_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetProduct .\n// @router /product [GET]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.ProductReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetProductService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"product\", utils.WarpResponse(ctx, c, resp))\n}\n\n// SearchProducts .\n// @router /search [GET]\nfunc SearchProducts(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.SearchProductsReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewSearchProductsService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"search\", resp)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/handler/product/product_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetProduct(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/product\", GetProduct)\n\tpath := \"/product\"                                        // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestSearchProducts(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/search\", SearchProducts)\n\tpath := \"/search\"                                         // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/cart/cart_page.go",
    "content": "// Code generated by hertz generator. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.POST(\"/cart\", append(_addcartitemMw(), cart.AddCartItem)...)\n\troot.GET(\"/cart\", append(_getcartMw(), cart.GetCart)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/cart/middleware.go",
    "content": "// Code generated by hertz generator.\n\npackage cart\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _getcartMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _addcartitemMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/category/category_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage category\n\nimport (\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/category\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_category := root.Group(\"/category\", _categoryMw()...)\n\t\t_category.GET(\"/:category\", append(_category0Mw(), category.Category)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/category/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage category\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _categoryMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _category0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/checkout/checkout_page.go",
    "content": "// Code generated by hertz generator. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/checkout\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/checkout\", append(_checkout0Mw(), checkout.Checkout)...)\n\t_checkout := root.Group(\"/checkout\", _checkoutMw()...)\n\t_checkout.GET(\"/result\", append(_checkoutresultMw(), checkout.CheckoutResult)...)\n\t_checkout.POST(\"/waiting\", append(_checkoutwaitingMw(), checkout.CheckoutWaiting)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/checkout/middleware.go",
    "content": "// Code generated by hertz generator.\n\npackage checkout\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _checkoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkout0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutresultMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutwaitingMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/order/middleware.go",
    "content": "// Code generated by hertz generator.\n\npackage order\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _orderlistMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/order/order_page.go",
    "content": "// Code generated by hertz generator. DO NOT EDIT.\n\npackage order\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/order\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/order\", append(_orderlistMw(), order.OrderList)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/product/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage product\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getproductMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _searchproductsMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/product/product_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage product\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/product\", append(_getproductMw(), product.GetProduct)...)\n\troot.GET(\"/search\", append(_searchproductsMw(), product.SearchProducts)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/cart\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/category\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/checkout\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/order\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\torder.Register(r)\n\n\tcheckout.Register(r)\n\n\tcart.Register(r)\n\n\tcategory.Register(r)\n\n\tproduct.Register(r)\n\n\tauth.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/add_cart_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype AddCartItemService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewAddCartItemService(Context context.Context, RequestContext *app.RequestContext) *AddCartItemService {\n\treturn &AddCartItemService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *AddCartItemService) Run(req *cart.AddCartItemReq) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\t_, err = rpc.CartClient.AddItem(h.Context, &rpccart.AddItemReq{\n\t\tUserId: uint32(frontendUtils.GetUserIdFromCtx(h.Context)),\n\t\tItem: &rpccart.CartItem{\n\t\t\tProductId: req.ProductId,\n\t\t\tQuantity:  uint32(req.ProductNum),\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CategoryService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCategoryService(Context context.Context, RequestContext *app.RequestContext) *CategoryService {\n\treturn &CategoryService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CategoryService) Run(req *category.CategoryReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{CategoryName: req.Category})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"title\": \"Category\",\n\t\t\"items\": p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutService(Context context.Context, RequestContext *app.RequestContext) *CheckoutService {\n\treturn &CheckoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{UserId: uint32(userId)})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\n\tfor _, v := range carts.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{\n\t\t\tId: v.ProductId,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":    p.Name,\n\t\t\t\"Price\":   strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\": p.Picture,\n\t\t\t\"Qty\":     strconv.Itoa(int(v.Quantity)),\n\t\t})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Checkout\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/checkout_result.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutResultService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutResultService(Context context.Context, RequestContext *app.RequestContext) *CheckoutResultService {\n\treturn &CheckoutResultService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutResultService) Run(req *common.Empty) (resp map[string]any, err error) {\n\treturn utils.H{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/checkout_waiting.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\trpcpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutWaitingService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutWaitingService(Context context.Context, RequestContext *app.RequestContext) *CheckoutWaitingService {\n\treturn &CheckoutWaitingService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutWaitingService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\t_, err = rpc.CheckoutClient.Checkout(h.Context, &rpccheckout.CheckoutReq{\n\t\tUserId:    uint32(userId),\n\t\tEmail:     req.Email,\n\t\tFirstname: req.Firstname,\n\t\tLastname:  req.Lastname,\n\t\tAddress: &rpccheckout.Address{\n\t\t\tCountry:       req.Country,\n\t\t\tZipCode:       req.Zipcode,\n\t\t\tCity:          req.City,\n\t\t\tState:         req.Province,\n\t\t\tStreetAddress: req.Street,\n\t\t},\n\t\tCreditCard: &rpcpayment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CardNum,\n\t\t\tCreditCardExpirationYear:  req.ExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.ExpirationMonth,\n\t\t\tCreditCardCvv:             req.Cvv,\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"title\":    \"waiting\",\n\t\t\"redirect\": \"/checkout/result\",\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetCartService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetCartService(Context context.Context, RequestContext *app.RequestContext) *GetCartService {\n\treturn &GetCartService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetCartService) Run(req *common.Empty) (resp map[string]any, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tcartResp, err := rpc.CartClient.GetCart(h.Context, &cart.GetCartReq{\n\t\tUserId: uint32(frontendUtils.GetUserIdFromCtx(h.Context)),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar items []map[string]string\n\tvar total float64\n\tfor _, item := range cartResp.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &product.GetProductReq{Id: item.ProductId})\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":        p.Name,\n\t\t\t\"Description\": p.Description,\n\t\t\t\"Price\":       strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\":     p.Picture,\n\t\t\t\"Qty\":         strconv.Itoa(int(item.Quantity)),\n\t\t})\n\t\ttotal += float64(p.Price) * float64(item.Quantity)\n\n\t}\n\treturn utils.H{\n\t\t\"title\": \"Cart\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetProductService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetProductService(Context context.Context, RequestContext *app.RequestContext) *GetProductService {\n\treturn &GetProductService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetProductService) Run(req *product.ProductReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: req.Id})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"item\": p.Product,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (res map[string]any, err error) {\n\tproducts, err := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Hot sale\",\n\t\t\"items\": products.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (redirect string, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tresp, err := rpc.UserClient.Login(h.Context, &user.LoginReq{\n\t\tEmail:    req.Email,\n\t\tPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", resp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tredirect = \"/\"\n\tif req.Next != \"\" {\n\t\tredirect = req.Next\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/order_list.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/types\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype OrderListService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewOrderListService(Context context.Context, RequestContext *app.RequestContext) *OrderListService {\n\treturn &OrderListService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *OrderListService) Run(req *common.Empty) (resp map[string]any, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tuserId := frontendUtils.GetUserIdFromCtx(h.Context)\n\torderResp, err := rpc.OrderClient.ListOrder(h.Context, &order.ListOrderReq{UserId: uint32(userId)})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar list []types.Order\n\tfor _, v := range orderResp.Orders {\n\t\tvar (\n\t\t\ttotal float32\n\t\t\titems []types.OrderItem\n\t\t)\n\n\t\tfor _, v := range v.Items {\n\t\t\ttotal += v.Cost\n\t\t\ti := v.Item\n\t\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &product.GetProductReq{Id: i.ProductId})\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif productResp == nil || productResp.Product == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tp := productResp.Product\n\n\t\t\titems = append(items, types.OrderItem{\n\t\t\t\tProductName: p.Name,\n\t\t\t\tPicture:     p.Picture,\n\t\t\t\tCost:        v.Cost,\n\t\t\t\tQty:         i.Quantity,\n\t\t\t})\n\t\t}\n\t\tcreated := time.Unix(int64(v.CreatedAt), 0)\n\t\tlist = append(list, types.Order{\n\t\t\tOrderId:     v.OrderId,\n\t\t\tCreatedDate: created.Format(\"2006-01-02 15:04:05\"),\n\t\t\tCost:        total,\n\t\t\tItems:       items,\n\t\t})\n\n\t}\n\n\treturn utils.H{\n\t\t\"title\":  \"Order\",\n\t\t\"orders\": list,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\t//defer func() {\n\t// hlog.CtxInfof(h.Context, \"req = %+v\", req)\n\t// hlog.CtxInfof(h.Context, \"resp = %+v\", resp)\n\t//}()\n\tuserResp, err := rpc.UserClient.Register(h.Context, &user.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tPasswordConfirm: req.PasswordConfirm,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", userResp.UserId)\n\terr = session.Save()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype SearchProductsService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewSearchProductsService(Context context.Context, RequestContext *app.RequestContext) *SearchProductsService {\n\treturn &SearchProductsService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *SearchProductsService) Run(req *product.SearchProductsReq) (resp map[string]any, err error) {\n\tproducts, err := rpc.ProductClient.SearchProducts(h.Context, &rpcproduct.SearchProductsReq{\n\t\tQuery: req.Q,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"items\": products.Results,\n\t\t\"q\":     req.Q,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tuserId := frontendUtils.GetUserIdFromCtx(ctx)\n\tcontent[\"user_id\"] = userId\n\n\tif userId > 0 {\n\t\tcartResp, err := rpc.CartClient.GetCart(ctx, &cart.GetCartReq{\n\t\t\tUserId: uint32(userId),\n\t\t})\n\t\tif err == nil && cartResp != nil {\n\t\t\tcontent[\"cart_num\"] = len(cartResp.Items)\n\t\t}\n\t}\n\n\treturn content\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"127.0.0.1:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.8.1\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115\n\tgithub.com/hertz-contrib/logger/logrus v1.0.1\n\tgithub.com/hertz-contrib/pprof v0.1.2\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgoogle.golang.org/protobuf v1.34.1\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.8.1 h1:3Upzd9o5yNPz6rLx70J5xpo5emosKNkmwW00WgQhf/0=\ngithub.com/cloudwego/hertz v0.8.1/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115 h1:EvTFSVPZhC2O2i3Krhutdje4sSXSc4nmLTkTttKh/s0=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20240128134225-6b18af47a115/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/logrus v1.0.1 h1:1iFu/L92QlFSDXUn77WJL32dk/5HBzAUziG1OqcNMeE=\ngithub.com/hertz-contrib/logger/logrus v1.0.1/go.mod h1:SqDYLwVq5hTItYqimgZQbFCYPOIGNvBTq0Ip2OQwMcY=\ngithub.com/hertz-contrib/pprof v0.1.2 h1:eC4jpg8ToSi+9YEOPIr3jki8e/ix3aFPtphCgJ36T6Q=\ngithub.com/hertz-contrib/pprof v0.1.2/go.mod h1:OKXw5wCUcy1OVwgQLsoCS9JzfcdjoofP+7Uk4c7P9Po=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=\ngithub.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is generated, with a higher priority than api_version\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the client code is generated\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[37]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12,\n\t0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76,\n\t0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t4,  // 37: api.reserve:extendee -> google.protobuf.MessageOptions\n\t38, // [38:38] is the sub-list for method output_type\n\t38, // [38:38] is the sub-list for method input_type\n\t38, // [38:38] is the sub-list for extension type_name\n\t0,  // [0:38] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 38,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\" form:\"password_confirm\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x73, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2,\n\t0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52,\n\t0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78,\n\t0x74, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69,\n\t0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69,\n\t0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73,\n\t0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x12, 0x3f, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb,\n\t0x18, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,\n\t0x72, 0x6d, 0x52, 0x0f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x72, 0x6d, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x17, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x4c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0f, 0xd2,\n\t0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x52,\n\t0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,\n\t0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x12,\n\t0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,\n\t0x65, 0x72, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x4b,\n\t0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*LoginReq)(nil),     // 0: frontend.auth.LoginReq\n\t(*RegisterReq)(nil),  // 1: frontend.auth.RegisterReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t1, // 1: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/hertz_gen/frontend/cart/cart_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: cart_page.proto\n\npackage cart\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AddCartItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId  uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\" form:\"productId\"`\n\tProductNum int32  `protobuf:\"varint,2,opt,name=product_num,json=productNum,proto3\" json:\"product_num,omitempty\" form:\"productNum\"`\n}\n\nfunc (x *AddCartItemReq) Reset() {\n\t*x = AddCartItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddCartItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddCartItemReq) ProtoMessage() {}\n\nfunc (x *AddCartItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddCartItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddCartItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AddCartItemReq) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *AddCartItemReq) GetProductNum() int32 {\n\tif x != nil {\n\t\treturn x.ProductNum\n\t}\n\treturn 0\n}\n\nvar File_cart_page_proto protoreflect.FileDescriptor\n\nvar file_cart_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x6f, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65,\n\t0x6d, 0x52, 0x65, 0x71, 0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0d, 0xe2, 0xbb, 0x18, 0x09, 0x70, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x75,\n\t0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0e, 0xe2, 0xbb, 0x18, 0x0a, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x4e, 0x75, 0x6d, 0x32, 0xa4, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74,\n\t0x65, 0x6d, 0x12, 0x1d, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x72, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65,\n\t0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x09, 0xd2, 0xc1, 0x18, 0x05, 0x2f,\n\t0x63, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12,\n\t0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x09, 0xca, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x42, 0x4b, 0x5a, 0x49, 0x67, 0x69,\n\t0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65,\n\t0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61,\n\t0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f,\n\t0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_page_proto_rawDescOnce sync.Once\n\tfile_cart_page_proto_rawDescData = file_cart_page_proto_rawDesc\n)\n\nfunc file_cart_page_proto_rawDescGZIP() []byte {\n\tfile_cart_page_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_page_proto_rawDescData)\n\t})\n\treturn file_cart_page_proto_rawDescData\n}\n\nvar file_cart_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_cart_page_proto_goTypes = []interface{}{\n\t(*AddCartItemReq)(nil), // 0: frontend.cart.AddCartItemReq\n\t(*common.Empty)(nil),   // 1: frontend.common.Empty\n}\nvar file_cart_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.cart.CartService.AddCartItem:input_type -> frontend.cart.AddCartItemReq\n\t1, // 1: frontend.cart.CartService.GetCart:input_type -> frontend.common.Empty\n\t1, // 2: frontend.cart.CartService.AddCartItem:output_type -> frontend.common.Empty\n\t1, // 3: frontend.cart.CartService.GetCart:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_page_proto_init() }\nfunc file_cart_page_proto_init() {\n\tif File_cart_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddCartItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_page_proto_goTypes,\n\t\tDependencyIndexes: file_cart_page_proto_depIdxs,\n\t\tMessageInfos:      file_cart_page_proto_msgTypes,\n\t}.Build()\n\tFile_cart_page_proto = out.File\n\tfile_cart_page_proto_rawDesc = nil\n\tfile_cart_page_proto_goTypes = nil\n\tfile_cart_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/hertz_gen/frontend/category/category_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: category_page.proto\n\npackage category\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CategoryReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory string `protobuf:\"bytes,1,opt,name=category,proto3\" json:\"category,omitempty\" path:\"category\"`\n}\n\nfunc (x *CategoryReq) Reset() {\n\t*x = CategoryReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_category_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryReq) ProtoMessage() {}\n\nfunc (x *CategoryReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_category_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryReq.ProtoReflect.Descriptor instead.\nfunc (*CategoryReq) Descriptor() ([]byte, []int) {\n\treturn file_category_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CategoryReq) GetCategory() string {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn \"\"\n}\n\nvar File_category_page_proto protoreflect.FileDescriptor\n\nvar file_category_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x08, 0x63, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xd2, 0xbb, 0x18,\n\t0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x32, 0x6e, 0x0a, 0x0f, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13,\n\t0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2f, 0x3a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x42, 0x4f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d,\n\t0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_category_page_proto_rawDescOnce sync.Once\n\tfile_category_page_proto_rawDescData = file_category_page_proto_rawDesc\n)\n\nfunc file_category_page_proto_rawDescGZIP() []byte {\n\tfile_category_page_proto_rawDescOnce.Do(func() {\n\t\tfile_category_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_category_page_proto_rawDescData)\n\t})\n\treturn file_category_page_proto_rawDescData\n}\n\nvar file_category_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_category_page_proto_goTypes = []interface{}{\n\t(*CategoryReq)(nil),  // 0: frontend.category.CategoryReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_category_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.category.CategoryService.Category:input_type -> frontend.category.CategoryReq\n\t1, // 1: frontend.category.CategoryService.Category:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_category_page_proto_init() }\nfunc file_category_page_proto_init() {\n\tif File_category_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_category_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_category_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_category_page_proto_goTypes,\n\t\tDependencyIndexes: file_category_page_proto_depIdxs,\n\t\tMessageInfos:      file_category_page_proto_msgTypes,\n\t}.Build()\n\tFile_category_page_proto = out.File\n\tfile_category_page_proto_rawDesc = nil\n\tfile_category_page_proto_goTypes = nil\n\tfile_category_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/hertz_gen/frontend/checkout/checkout_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: checkout_page.proto\n\npackage checkout\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tFirstname       string `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\" form:\"firstname\"`\n\tLastname        string `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\" form:\"lastname\"`\n\tStreet          string `protobuf:\"bytes,4,opt,name=street,proto3\" json:\"street,omitempty\" form:\"street\"`\n\tZipcode         string `protobuf:\"bytes,5,opt,name=zipcode,proto3\" json:\"zipcode,omitempty\" form:\"zipcode\"`\n\tProvince        string `protobuf:\"bytes,6,opt,name=province,proto3\" json:\"province,omitempty\" form:\"province\"`\n\tCountry         string `protobuf:\"bytes,7,opt,name=country,proto3\" json:\"country,omitempty\" form:\"country\"`\n\tCity            string `protobuf:\"bytes,8,opt,name=city,proto3\" json:\"city,omitempty\" form:\"city\"`\n\tCardNum         string `protobuf:\"bytes,9,opt,name=card_num,json=cardNum,proto3\" json:\"card_num,omitempty\" form:\"cardNum\"`\n\tExpirationMonth int32  `protobuf:\"varint,10,opt,name=expiration_month,json=expirationMonth,proto3\" json:\"expiration_month,omitempty\" form:\"expirationMonth\"`\n\tExpirationYear  int32  `protobuf:\"varint,11,opt,name=expiration_year,json=expirationYear,proto3\" json:\"expiration_year,omitempty\" form:\"expirationYear\"`\n\tCvv             int32  `protobuf:\"varint,12,opt,name=cvv,proto3\" json:\"cvv,omitempty\" form:\"cvv\"`\n\tPayment         string `protobuf:\"bytes,13,opt,name=payment,proto3\" json:\"payment,omitempty\" form:\"payment\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetStreet() string {\n\tif x != nil {\n\t\treturn x.Street\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetZipcode() string {\n\tif x != nil {\n\t\treturn x.Zipcode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCardNum() string {\n\tif x != nil {\n\t\treturn x.CardNum\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationMonth\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetCvv() int32 {\n\tif x != nil {\n\t\treturn x.Cvv\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetPayment() string {\n\tif x != nil {\n\t\treturn x.Payment\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_page_proto protoreflect.FileDescriptor\n\nvar file_checkout_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa6, 0x04, 0x0a, 0x0b, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d,\n\t0xe2, 0xbb, 0x18, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x0a, 0xe2, 0xbb, 0x18, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x52, 0x06,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x7a, 0x69, 0x70,\n\t0x63, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a,\n\t0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70,\n\t0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x63, 0x6f,\n\t0x75, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c,\n\t0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xe2, 0xbb,\n\t0x18, 0x04, 0x63, 0x69, 0x74, 0x79, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x08,\n\t0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b,\n\t0xe2, 0xbb, 0x18, 0x07, 0x63, 0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x52, 0x07, 0x63, 0x61, 0x72,\n\t0x64, 0x4e, 0x75, 0x6d, 0x12, 0x3e, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13,\n\t0xe2, 0xbb, 0x18, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f,\n\t0x6e, 0x74, 0x68, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x6f, 0x6e, 0x74, 0x68, 0x12, 0x3b, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, 0xe2,\n\t0xbb, 0x18, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x12, 0x19, 0x0a, 0x03, 0x63, 0x76, 0x76, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xe2, 0xbb, 0x18, 0x03, 0x63, 0x76, 0x76, 0x52, 0x03, 0x63, 0x76, 0x76, 0x12, 0x25, 0x0a, 0x07,\n\t0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2,\n\t0xbb, 0x18, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x32, 0x96, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x22, 0x0d, 0xca, 0xc1, 0x18, 0x09, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f,\n\t0x75, 0x74, 0x12, 0x60, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x57, 0x61,\n\t0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f,\n\t0x75, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0xd2,\n\t0xc1, 0x18, 0x11, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x77, 0x61, 0x69,\n\t0x74, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0xca, 0xc1, 0x18, 0x10, 0x2f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x4f, 0x5a, 0x4d,\n\t0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64,\n\t0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f,\n\t0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_page_proto_rawDescOnce sync.Once\n\tfile_checkout_page_proto_rawDescData = file_checkout_page_proto_rawDesc\n)\n\nfunc file_checkout_page_proto_rawDescGZIP() []byte {\n\tfile_checkout_page_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_page_proto_rawDescData)\n\t})\n\treturn file_checkout_page_proto_rawDescData\n}\n\nvar file_checkout_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_checkout_page_proto_goTypes = []interface{}{\n\t(*CheckoutReq)(nil),  // 0: frontend.checkout.CheckoutReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_checkout_page_proto_depIdxs = []int32{\n\t1, // 0: frontend.checkout.CheckoutService.Checkout:input_type -> frontend.common.Empty\n\t0, // 1: frontend.checkout.CheckoutService.CheckoutWaiting:input_type -> frontend.checkout.CheckoutReq\n\t1, // 2: frontend.checkout.CheckoutService.CheckoutResult:input_type -> frontend.common.Empty\n\t1, // 3: frontend.checkout.CheckoutService.Checkout:output_type -> frontend.common.Empty\n\t1, // 4: frontend.checkout.CheckoutService.CheckoutWaiting:output_type -> frontend.common.Empty\n\t1, // 5: frontend.checkout.CheckoutService.CheckoutResult:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_page_proto_init() }\nfunc file_checkout_page_proto_init() {\n\tif File_checkout_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_page_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_page_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_page_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_page_proto = out.File\n\tfile_checkout_page_proto_rawDesc = nil\n\tfile_checkout_page_proto_goTypes = nil\n\tfile_checkout_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x1a, 0x09, 0x61, 0x70, 0x69,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x4c, 0x0a,\n\t0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x04,\n\t0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a, 0x49, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.home.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.home.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/hertz_gen/frontend/order/order_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: order_page.proto\n\npackage order\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_order_page_proto protoreflect.FileDescriptor\n\nvar file_order_page_proto_rawDesc = []byte{\n\t0x0a, 0x10, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x32, 0x57, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x73,\n\t0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0a, 0xca, 0xc1, 0x18, 0x06, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x4c, 0x5a,\n\t0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar file_order_page_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_order_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.order.OrderService.OrderList:input_type -> frontend.common.Empty\n\t0, // 1: frontend.order.OrderService.OrderList:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_order_page_proto_init() }\nfunc file_order_page_proto_init() {\n\tif File_order_page_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_page_proto_goTypes,\n\t\tDependencyIndexes: file_order_page_proto_depIdxs,\n\t}.Build()\n\tFile_order_page_proto = out.File\n\tfile_order_page_proto_rawDesc = nil\n\tfile_order_page_proto_goTypes = nil\n\tfile_order_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/hertz_gen/frontend/product/product_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v5.26.1\n// source: product_page.proto\n\npackage product\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\" query:\"id\"`\n}\n\nfunc (x *ProductReq) Reset() {\n\t*x = ProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProductReq) ProtoMessage() {}\n\nfunc (x *ProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProductReq.ProtoReflect.Descriptor instead.\nfunc (*ProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQ string `protobuf:\"bytes,1,opt,name=q,proto3\" json:\"q,omitempty\" query:\"q\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *SearchProductsReq) GetQ() string {\n\tif x != nil {\n\t\treturn x.Q\n\t}\n\treturn \"\"\n}\n\nvar File_product_page_proto protoreflect.FileDescriptor\n\nvar file_product_page_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,\n\t0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x42, 0x06, 0xb2, 0xbb, 0x18, 0x02, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x22, 0x28,\n\t0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x12, 0x13, 0x0a, 0x01, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05,\n\t0xb2, 0xbb, 0x18, 0x01, 0x71, 0x52, 0x01, 0x71, 0x32, 0xbe, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x47,\n\t0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x0c, 0xca, 0xc1, 0x18, 0x08, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x5a, 0x0a,\n\t0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12,\n\t0x23, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0b, 0xca, 0xc1,\n\t0x18, 0x07, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74,\n\t0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67,\n\t0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c,\n\t0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68,\n\t0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_product_page_proto_rawDescOnce sync.Once\n\tfile_product_page_proto_rawDescData = file_product_page_proto_rawDesc\n)\n\nfunc file_product_page_proto_rawDescGZIP() []byte {\n\tfile_product_page_proto_rawDescOnce.Do(func() {\n\t\tfile_product_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_page_proto_rawDescData)\n\t})\n\treturn file_product_page_proto_rawDescData\n}\n\nvar file_product_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_product_page_proto_goTypes = []interface{}{\n\t(*ProductReq)(nil),        // 0: frontend.product.ProductReq\n\t(*SearchProductsReq)(nil), // 1: frontend.product.SearchProductsReq\n\t(*common.Empty)(nil),      // 2: frontend.common.Empty\n}\nvar file_product_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.product.ProductService.GetProduct:input_type -> frontend.product.ProductReq\n\t1, // 1: frontend.product.ProductService.SearchProducts:input_type -> frontend.product.SearchProductsReq\n\t2, // 2: frontend.product.ProductService.GetProduct:output_type -> frontend.common.Empty\n\t2, // 3: frontend.product.ProductService.SearchProducts:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_product_page_proto_init() }\nfunc file_product_page_proto_init() {\n\tif File_product_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_page_proto_goTypes,\n\t\tDependencyIndexes: file_product_page_proto_depIdxs,\n\t\tMessageInfos:      file_product_page_proto_msgTypes,\n\t}.Build()\n\tFile_product_page_proto = out.File\n\tfile_product_page_proto_rawDesc = nil\n\tfile_product_page_proto_goTypes = nil\n\tfile_product_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tUserClient     userservice.Client\n\tProductClient  productcatalogservice.Client\n\tCartClient     cartservice.Client\n\tCheckoutClient checkoutservice.Client\n\tOrderClient    orderservice.Client\n\tonce           sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitUserClient()\n\t\tinitProductClient()\n\t\tinitCartClient()\n\t\tinitCheckoutClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initUserClient() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\tUserClient, err = userservice.NewClient(\"user\", client.WithResolver(r))\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCheckoutClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tCheckoutClient, err = checkoutservice.NewClient(\"checkout\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/infra/rpc/client_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\nfunc Test_iniUserClient(t *testing.T) {\n\tinitUserClient()\n\tresp, err := UserClient.Login(context.Background(), &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"jfoajsfoji\",\n\t})\n\tif err != nil {\n\t\tt.Errorf(\"err: %v\", err)\n\t\treturn\n\t}\n\tt.Logf(\"resp: %v\", resp)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzlogrus \"github.com/hertz-contrib/logger/logrus\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\t// init dal\n\t// dal.Init()\n\trpc.InitClient()\n\taddress := conf.GetConf().Hertz.Address\n\th := server.New(server.WithHostPorts(address))\n\n\tregisterMiddleware(h)\n\n\t// add a ping route to test\n\th.GET(\"/ping\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.JSON(consts.StatusOK, utils.H{\"ping\": \"pong\"})\n\t})\n\n\trouter.GeneratedRegister(h)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Static(\"/static\", \"./\")\n\n\th.GET(\"/about\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"about\", utils.H{\"title\": \"About\"})\n\t})\n\n\th.GET(\"/sign-in\", func(c context.Context, ctx *app.RequestContext) {\n\t\tdata := utils.H{\n\t\t\t\"title\": \"Sign In\",\n\t\t\t\"next\":  ctx.Query(\"next\"),\n\t\t}\n\t\tctx.HTML(consts.StatusOK, \"sign-in\", data)\n\t})\n\th.GET(\"/sign-up\", func(c context.Context, ctx *app.RequestContext) {\n\t\tctx.HTML(consts.StatusOK, \"sign-up\", utils.H{\"title\": \"Sign Up\"})\n\t})\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\tstore, err := redis.NewStore(10, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\n\t// log\n\tlogger := hertzlogrus.NewLogger()\n\thlog.SetLogger(logger)\n\thlog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Hertz.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Hertz.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Hertz.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Hertz.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\thlog.SetOutput(asyncWriter)\n\th.OnShutdown = append(h.OnShutdown, func(ctx context.Context) {\n\t\tasyncWriter.Sync()\n\t})\n\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\t// cores\n\th.Use(cors.Default())\n\n\tmiddleware.Register(h)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\tfrontendUtils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tctx = context.WithValue(ctx, frontendUtils.SessionUserId, s.Get(\"user_id\"))\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\ts := sessions.Default(c)\n\t\tuserId := s.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Redirect(302, []byte(\"/sign-in?next=\"+c.FullPath()))\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc Register(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/about.tmpl",
    "content": "{{define \"about\"}}\n{{template \"header\" .}}\n  <div>\n    <img src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" class=\"col-lg-2 col-md-3 col-sm-4\"/>\n    <p>This is community a driven project.</p>\n  </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/cart-num.tmpl",
    "content": "{{define \"cart-num\"}}\n    <a href=\"/cart\" class=\"btn position-relative\">\n        <i class=\"fa-solid fa-cart-shopping fa-xl\">\n        </i>\n        {{ if $.cart_num}}\n        <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\">\n    {{ $.cart_num }}\n            {{ end }}\n  </span>\n    </a>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/cart.tmpl",
    "content": "{{ define \"cart\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <ul class=\"list-group\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n        {{ if $.items }}\n            <div class=\"mt-3 mb-5\">\n                <div class=\"float-end\">\n                    <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                    <a href=\"/checkout\" class=\"btn btn-lg btn-success float-end\">Check out</a>\n                </div>\n            </div>\n        {{else}}\n            <h1 class=\"text-center text-danger\">Your Cart is empty</h1>\n            <div class=\"text-center\"><a href=\"/\">Shop Hot Sale</a></div>\n        {{ end }}\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/category.tmpl",
    "content": "{{ define \"category\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/checkout.tmpl",
    "content": "{{ define \"checkout\" }}\n    {{ template \"header\" . }}\n    <div class=\"row mb-5\">\n        <div class=\"col-lg-8 col-sm-12\">\n            <form method=\"post\" action=\"/checkout/waiting\">\n                <h4 class=\"mb-3 mt-3\">Contact</h4>\n                <label for=\"email\" class=\"form-label col-12\">\n                    <input class=\"form-control\" id=\"email\" type=\"email\" placeholder=\"Email\" name=\"email\"\n                           aria-label=\"email\" value=\"abc@example.com\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">Delivery</h4>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"firstname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"firstname\" class=\"form-control\" placeholder=\"First name\"\n                               name=\"firstname\" value=\"world\">\n                    </label>\n                    <label for=\"lastname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"lastname\" class=\"form-control\" placeholder=\"Last name\" name=\"lastname\"\n                               value=\"hello\">\n                    </label>\n                </div>\n                <label for=\"street\" class=\"mb-3 mt-3 col-12 form-label\">\n                    <input type=\"text\" class=\"form-control\" placeholder=\"Street\" name=\"street\" value=\"7th street\"\n                           id=\"street\">\n                </label>\n                <label for=\"zipcode\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"zipcode\" name=\"zipcode\" placeholder=\"zipcode\"\n                           value=\"310000\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"city\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"city\" class=\"form-control\" placeholder=\"City\" name=\"city\"\n                               value=\"hangzhou\">\n                    </label>\n                    <label for=\"province\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"province\" class=\"form-control\" name=\"province\" placeholder=\"Province\"\n                               value=\"zhejiang\">\n                    </label>\n                </div>\n                <label for=\"country\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"country\" name=\"country\" placeholder=\"Country\"\n                           value=\"china\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">\n                    Payment\n                </h4>\n                <label for=\"card-num\" class=\"form-label col-12\">\n                    <input type=\"text\" id=\"card-num\" class=\"form-control\" name=\"cardNum\" placeholder=\"Card number\"\n                           value=\"424242424242424242\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"expiration-month\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-month\" name=\"expirationMonth\" class=\"form-control\"\n                               placeholder=\"Expiration Month\" value=\"12\">\n                    </label>\n                    <label for=\"expiration-year\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-year\" name=\"expirationYear\" class=\"form-control\"\n                               placeholder=\"Expiration Year\" value=\"2030\">\n                    </label>\n                    <label for=\"cvv\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"cvv\" class=\"form-control\" name=\"cvv\" placeholder=\"cvv\" required>\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"card\" value=\"card\" checked>\n                    <label class=\"form-check-label\" for=\"card\">\n                        Card\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"stripe\" value=\"stripe\" disabled>\n                    <label class=\"form-check-label\" for=\"stripe\">\n                        Stripe\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"paypal\" value=\"paypal\" disabled>\n                    <label class=\"form-check-label\" for=\"paypal\">\n                        Paypal\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"wechat\" value=\"wechat\" disabled>\n                    <label class=\"form-check-label\" for=\"wechat\">\n                        Wechat\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"alipay\" value=\"alipay\" disabled>\n                    <label class=\"form-check-label\" for=\"alipay\">\n                        Alipay\n                    </label>\n                </div>\n                <div class=\"mt-3 mb-3\">\n                    <div class=\"float-end\">\n                        <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                        <input type=\"submit\" class=\"btn btn-success\" value=\"Pay\">\n                    </div>\n                </div>\n            </form>\n        </div>\n        <ul class=\"list-group col-lg-4 col-sm-12\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/footer.tmpl",
    "content": "{{define \"footer\"}}\n</div>\n</main>\n  <footer>\n    <div class=\"text-bg-primary py-5 text-center\">\n      <p>&copy; 2024 <a href=\"https://github.com/cloudwego\" class=\"text-reset\">CloudWeGo</a></p>\n    </div>\n  </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\" integrity=\"sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz\" crossorigin=\"anonymous\"></script>\n  </body>\n</html>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/header.tmpl",
    "content": "{{define \"header\"}}\n<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    {{ if $.redirect }}\n        <meta http-equiv=\"refresh\" content=\"5;url={{ $.redirect }}\"/>\n    {{ end}}\n    <title>CloudWeGo Shop</title>\n    <link href=\"/static/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n            integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n</head>\n<body class=\"min-vh-100\">\n<header>\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container\">\n        <img class=\"navbar-brand\" href=\"#\" src=\"/static/image/logo.jpg\" alt=\"CloudWeGo\" style=\"height: 3em;\"/>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n        </button>\n        <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n            <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"/\">CloudWeGo Shop</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Categories\n            </a>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"/category/t-shirt\">T-shirt</a></li>\n                <li><a class=\"dropdown-item\" href=\"/category/sticker\">Sticker</a></li>\n            </ul>\n            </li>\n            <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"/about\" >About</a>\n            </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n            <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n        {{ template \"cart-num\" . }}\n\n        {{ if .user_id }}\n        <div class=\"dropdown\">\n            <div class=\"ms-3 dropdown-toggle\" data-bs-toggle=\"dropdown\">\n                <i class=\"fa-solid fa-user fa-lg\"></i>\n                <span>Hello</span>\n            </div>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"/order\">Order Center</a></li>\n                <li>\n                    <form action=\"/auth/logout\" method=\"post\">\n                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                    </form>\n                </li>\n            </ul>\n        </div>\n        {{ else }}\n        <div class=\"ms-3\">\n        <a type=\"button\" class=\"btn btn-primary\" href=\"/sign-in\">Sign In</a>\n        </div>\n        {{ end }}\n        </div>\n    </div>\n    </nav>\n    <div class=\"text-bg-primary text-center\">\n    <p>This Website is hosted for demo purposes only.It is not an actual shop</p>\n    </div>\n\n    {{ if .error }}\n    <div class=\"alert alert-danger text-center\" role=\"alert\">{{ .error }}</div>\n    {{ end }}\n    {{ if .warning }}\n        <div class=\"alert alert-warning text-center\" role=\"alert\">{{ .warning }}</div>\n    {{ end }}\n</header>\n<main style=\"min-height: calc(80vh);\">\n<div class=\"container-fluid py-3\">\n<h1 class=\"text-center\">{{$.title}}</h1>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/home.tmpl",
    "content": "{{define \"home\"}}\n{{template \"header\" .}}\n    <div class=\"row\">\n      {{range .items}}\n      <div class=\"card col-xl-3 col-lg-4 col-md-6 col-sm-12 p-5 border-0\">\n        <a href=\"/product?id={{ .Id }}\"  class=\"btn\">\n        <img src=\"{{.Picture}}\" class=\"card-img-top\" alt=\"...\">\n        <div class=\"card-body\">\n          <p class=\"card-text\">{{ .Name}}</p>\n          <h5 class=\"card-title\">{{ .Price}}</h5>\n        </div>\n        </a>\n      </div>\n      {{end}}\n    </div>\n{{template \"footer\"}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/order.tmpl",
    "content": "{{ define \"order\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n                    <div class=\"card-body row\">\n                        {{ range $.orders }}\n                        <div class=\"card\">\n                            <div class=\"card-body\">\n                              <h6 class=\"card-subtitle mb-2 text-muted\">{{.CreatedDate}} Order ID: {{.OrderId}}</h6>\n                              <ul class=\"list-group col-lg-12 col-sm-15\">\n                                {{ range .Items }}\n                                    <li class=\"list-group-item border-0\">\n                                        <div class=\"card border-0\">\n                                            <div class=\"card-body row\">\n                                                <div class=\"col-3\">\n                                                    <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                                                </div>\n                                                <div class=\"col-3\">\n                                                    <div class=\"mt-1\">{{ .ProductName }}</div>\n                                                </div>\n                                                <div class=\"col-2\">\n                                                    <div class=\"mt-1\">x {{ .Qty }}</div>\n                                                </div>\n                                                <div class=\"col-4\">\n                                                    <div class=\"mt-1\">Cost: {{ .Cost }}</div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </li>\n                                {{ end}}\n                            </ul>\n                            </div>\n                        </div>\n                        <p>\n                        {{ end}}\n                    </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/product.tmpl",
    "content": "{{ define \"product\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div id=\"productPicture\" class=\"carousel slide col-lg-6 col-sm-12\">\n                    <div class=\"carousel-indicators\">\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"0\"\n                                class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"1\"\n                                aria-label=\"Slide 2\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"2\"\n                                aria-label=\"Slide 3\"></button>\n                    </div>\n                    <div class=\"carousel-inner\">\n                        <div class=\"carousel-item active\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                    </div>\n                    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"prev\">\n                        <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Previous</span>\n                    </button>\n                    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"next\">\n                        <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Next</span>\n                    </button>\n                </div>\n                <div class=\"col-lg-1\"></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-center\">\n                    <form action=\"/cart\" method=\"post\">\n                        <h5 class=\"card-title\">{{ .item.Name }}</h5>\n                        <p class=\"card-text\">{{ .item.Description }}</p>\n                        <p class=\"card-text\">${{ .item.Price }}</p>\n                        <input type=\"hidden\" value=\"{{ .item.Id }}\" name=\"productId\">\n                        <label for=\"productNum\">数量：</label>\n                        <input type=\"number\" class=\"form-control mt-3\" id=\"productNum\" name=\"productNum\" value=\"1\"\n                               min=\"1\"/>\n                        <input type=\"submit\" class=\"btn btn-primary mt-3\" value=\"Add to Cart\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/required.tmpl",
    "content": "{{ define \"required\" }}\n<span class=\"text-danger\">*</span>\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/result.tmpl",
    "content": "{{ define \"result\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <i class=\"fa-regular fa-circle-check fs-1 text-success\"></i>\n        <div class=\"text-center fs-3\">\n            Congratulations, you have successfully placed an order.\n        </div>\n    </div>\n    <div class=\"d-flex justify-content-center\">\n        <a href=\"/order\" class=\"btn btn-info\">Check Order</a>\n        <a href=\"/\" class=\"btn btn-success ms-5\">Back to Home</a>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/search.tmpl",
    "content": "{{ define \"search\" }}\n    {{ template \"header\" . }}\n    {{ if .q }}\n        <div class=\"d-inline-block border border-success rounded-4 p-1 ps-4 pe-4\">\n            <div>\n                {{ .q }}\n                <a href=\"/\" class=\"ps-4\">\n                    <button type=\"button\" class=\"btn btn-sm btn-danger\" aria-label=\"Close\">X</button>\n                </a>\n            </div>\n        </div>\n    {{ end}}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/sign-in.tmpl",
    "content": "{{define \"sign-in\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/login?next={{ .next }}\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign Up</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign In</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/sign-up.tmpl",
    "content": "{{define \"sign-up\"}}\n{{ template \"header\" . }}\n    <div class=\"row justify-content-center\">\n        <div class=\"col-4\">\n        <form method=\"post\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n              <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n              <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password_confirm\" class=\"form-label\">Password Confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password_confirm\" name=\"password_confirm\">\n              </div>\n            <div class=\"mb-3\">\n                Already have a account, click here to <a href=\"/sign-in\">Sign In</a>.\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Sign Up</button>\n          </form>\n    </div>\n</div>\n{{ template \"footer\" .}}\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/template/waiting.tmpl",
    "content": "{{ define \"waiting\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <div class=\"text-danger h3 text-center mb-5\">\n            Wait a minutes, please don't close the window\n        </div>\n        <div class=\"spinner-grow text-primary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-secondary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-success\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-danger\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-warning\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-info\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-light\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-dark\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/types/order.go",
    "content": "package types\n\ntype OrderItem struct {\n\tProductName string\n\tPicture     string\n\tQty         uint32\n\tCost        float32\n}\n\ntype Order struct {\n\tOrderId     string\n\tCreatedDate string\n\tCost        float32\n\tItems       []OrderItem\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\ntype SessionUserIdKey string\n\nconst SessionUserId SessionUserIdKey = \"user_id\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) int32 {\n\tuserId := ctx.Value(SessionUserId)\n\tif userId == nil {\n\t\treturn 0\n\t}\n\treturn userId.(int32)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tif err := DB.AutoMigrate(&model.Order{}, &model.OrderItem{}); err != nil {\n\t\t\tklog.Error(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/biz/model/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Consignee struct {\n\tEmail         string\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       string\n}\n\ntype Order struct {\n\tgorm.Model\n\tOrderId    string      `gorm:\"type:varchar(100);uniqueIndex\"`\n\tUserId     uint32      `gorm:\"type:int(11)\"`\n\tConsignee  Consignee   `gorm:\"embedded\"`\n\tOrderItems []OrderItem `gorm:\"foreignKey:OrderIdRefer;references:OrderId\"`\n}\n\nfunc (Order) TableName() string {\n\treturn \"order\"\n}\n\nfunc ListOrder(ctx context.Context, db *gorm.DB, userId uint32) ([]*Order, error) {\n\tvar orders []*Order\n\terr := db.WithContext(ctx).Where(\"user_id = ?\", userId).Preload(\"OrderItems\").Find(&orders).Error\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn orders, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/biz/model/order_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype OrderItem struct {\n\tgorm.Model\n\tProductId    uint32  `gorm:\"type:int(11)\"`\n\tOrderIdRefer string  `gorm:\"type:varchar(100);index\"`\n\tQuantity     uint32  `gorm:\"type:int(11)\"`\n\tCost         float32 `gorm:\"type:decimal(10,2)\"`\n}\n\nfunc (OrderItem) TableName() string {\n\treturn \"order_item\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/biz/service/list_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype ListOrderService struct {\n\tctx context.Context\n} // NewListOrderService new ListOrderService\nfunc NewListOrderService(ctx context.Context) *ListOrderService {\n\treturn &ListOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListOrderService) Run(req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\t// Finish your business logic.\n\tlist, err := model.ListOrder(s.ctx, mysql.DB, req.UserId)\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(500001, err.Error())\n\t}\n\n\tvar orders []*order.Order\n\tfor _, v := range list {\n\t\tvar items []*order.OrderItem\n\t\tfor _, oi := range v.OrderItems {\n\t\t\titems = append(items, &order.OrderItem{\n\t\t\t\tItem: &cart.CartItem{\n\t\t\t\t\tProductId: oi.ProductId,\n\t\t\t\t\tQuantity:  oi.Quantity,\n\t\t\t\t},\n\t\t\t\tCost: oi.Cost,\n\t\t\t})\n\t\t}\n\t\torders = append(orders, &order.Order{\n\t\t\tCreatedAt: int32(v.CreatedAt.Unix()),\n\t\t\tOrderId:   v.OrderId,\n\t\t\tUserId:    v.UserId,\n\t\t\tEmail:     v.Consignee.Email,\n\t\t\tAddress: &order.Address{\n\t\t\t\tStreetAddress: v.Consignee.StreetAddress,\n\t\t\t\tCountry:       v.Consignee.Country,\n\t\t\t\tCity:          v.Consignee.City,\n\t\t\t\tState:         v.Consignee.State,\n\t\t\t\tZipCode:       v.Consignee.ZipCode,\n\t\t\t},\n\t\t\tItems: items,\n\t\t})\n\t}\n\tresp = &order.ListOrderResp{\n\t\tOrders: orders,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/biz/service/list_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n)\n\nfunc TestListOrder_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewListOrderService(ctx)\n\t// init req and assert value\n\n\treq := &order.ListOrderReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/biz/service/place_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype PlaceOrderService struct {\n\tctx context.Context\n} // NewPlaceOrderService new PlaceOrderService\nfunc NewPlaceOrderService(ctx context.Context) *PlaceOrderService {\n\treturn &PlaceOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *PlaceOrderService) Run(req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\t// Finish your business logic.\n\tif len(req.Items) == 0 {\n\t\terr = kerrors.NewBizStatusError(500001, \"items is empty\")\n\t\treturn\n\t}\n\terr = mysql.DB.Transaction(func(tx *gorm.DB) error {\n\t\torderId, _ := uuid.NewUUID()\n\n\t\to := &model.Order{\n\t\t\tOrderId: orderId.String(),\n\t\t\tUserId:  req.UserId,\n\t\t\tConsignee: model.Consignee{\n\t\t\t\tEmail: req.Email,\n\t\t\t},\n\t\t}\n\t\tif req.Address != nil {\n\t\t\ta := req.Address\n\t\t\to.Consignee.StreetAddress = a.StreetAddress\n\t\t\to.Consignee.City = a.City\n\t\t\to.Consignee.State = a.State\n\t\t\to.Consignee.Country = a.Country\n\t\t}\n\t\tif err := tx.Create(o).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvar items []model.OrderItem\n\t\tfor _, v := range req.Items {\n\t\t\titems = append(items, model.OrderItem{\n\t\t\t\tOrderIdRefer: orderId.String(),\n\t\t\t\tProductId:    v.Item.ProductId,\n\t\t\t\tQuantity:     v.Item.Quantity,\n\t\t\t\tCost:         v.Cost,\n\t\t\t})\n\t\t}\n\t\tif err := tx.Create(items).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tresp = &order.PlaceOrderResp{\n\t\t\tOrder: &order.OrderResult{\n\t\t\t\tOrderId: orderId.String(),\n\t\t\t},\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/biz/service/place_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n)\n\nfunc TestPlaceOrder_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewPlaceOrderService(ctx)\n\t// init req and assert value\n\n\treq := &order.PlaceOrderReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"order\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/conf/conf.go",
    "content": "package conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8884\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8884\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8884\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/order\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.2\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.34.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.2 h1:L0L3fcSNReTRGyZ6AqAEN0K56wYeYAwapBIhkvh0f3E=\ngithub.com/redis/go-redis/v9 v9.5.2/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/service\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n)\n\n// OrderServiceImpl implements the last service interface defined in the IDL.\ntype OrderServiceImpl struct{}\n\n// PlaceOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) PlaceOrder(ctx context.Context, req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = service.NewPlaceOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// ListOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) ListOrder(ctx context.Context, req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\tresp, err = service.NewListOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'order'\n  ToolVersion: 'v0.9.1'\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := orderservice.NewServer(new(OrderServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\topts = append(opts, server.WithServiceAddr(addr), server.WithRegistry(r))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/order/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/order\"\nexec \"$CURDIR/bin/order\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tif err = DB.AutoMigrate(&model.PaymentLog{}); err != nil {\n\t\t\tklog.Error(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/biz/model/payment.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype PaymentLog struct {\n\tgorm.Model\n\tUserId        uint32    `json:\"user_id\"`\n\tOrderId       string    `json:\"order_id\"`\n\tTransactionId string    `json:\"transaction_id\"`\n\tAmount        float32   `json:\"amount\"`\n\tPayAt         time.Time `json:\"pay_at\"`\n}\n\nfunc (p PaymentLog) TableName() string {\n\treturn \"payment_log\"\n}\n\nfunc CreatePaymentLog(db *gorm.DB, ctx context.Context, payment *PaymentLog) error {\n\treturn db.WithContext(ctx).Model(&PaymentLog{}).Create(payment).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/biz/service/charge.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\tcreditcard \"github.com/durango/go-credit-card\"\n\t\"github.com/google/uuid\"\n)\n\ntype ChargeService struct {\n\tctx context.Context\n} // NewChargeService new ChargeService\nfunc NewChargeService(ctx context.Context) *ChargeService {\n\treturn &ChargeService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ChargeService) Run(req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\t// Finish your business logic.\n\tcard := creditcard.Card{\n\t\tNumber: req.CreditCard.CreditCardNumber,\n\t\tCvv:    strconv.Itoa(int(req.CreditCard.CreditCardCvv)),\n\t\tMonth:  strconv.Itoa(int(req.CreditCard.CreditCardExpirationMonth)),\n\t\tYear:   strconv.Itoa(int(req.CreditCard.CreditCardExpirationYear)),\n\t}\n\n\terr = card.Validate(true)\n\tif err != nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(4004001, err.Error())\n\t}\n\ttransactionId, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(4005001, err.Error())\n\t}\n\n\terr = model.CreatePaymentLog(mysql.DB, s.ctx, &model.PaymentLog{\n\t\tUserId:        req.UserId,\n\t\tOrderId:       req.OrderId,\n\t\tTransactionId: transactionId.String(),\n\t\tAmount:        req.Amount,\n\t\tPayAt:         time.Now(),\n\t})\n\tif err != nil {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(4005002, err.Error())\n\t}\n\n\treturn &payment.ChargeResp{TransactionId: transactionId.String()}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/biz/service/charge_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n)\n\nfunc TestCharge_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewChargeService(ctx)\n\t// init req and assert value\n\n\treq := &payment.ChargeReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"payment\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/payment\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.2\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca h1:TE5KFwos5Gxn1IHdwW05E98wZ/nM9efZe12D8h5eunA=\ngithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca/go.mod h1:0miM9JonVZc9rPFBnCJpeoPiANNzT9ZfbJR3hDlXu14=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082 h1:3RgcPZrUWhrxqhtDkuRmDTRVXGkxrVMZtJMic7cEtGA=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082/go.mod h1:jKPLGXGRR3v90kZOLs/kUMffoEot8IrRDGmmzI3kOtg=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.2 h1:L0L3fcSNReTRGyZ6AqAEN0K56wYeYAwapBIhkvh0f3E=\ngithub.com/redis/go-redis/v9 v9.5.2/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/service\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n)\n\n// PaymentServiceImpl implements the last service interface defined in the IDL.\ntype PaymentServiceImpl struct{}\n\n// Charge implements the PaymentServiceImpl interface.\nfunc (s *PaymentServiceImpl) Charge(ctx context.Context, req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tresp, err = service.NewChargeService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'payment'\n  ToolVersion: 'v0.9.1'\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := paymentservice.NewServer(new(PaymentServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}), server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/payment/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/payment\"\nexec \"$CURDIR/bin/payment\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.Product{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Product{},\n\t\t\t&model.Category{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `product`.`category` VALUES (1,'2023-12-06 15:05:06','2023-12-06 15:05:06','T-Shirt','T-Shirt'),(2,'2023-12-06 15:05:06','2023-12-06 15:05:06','Sticker','Sticker')\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product` VALUES ( 1, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Notebook', 'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ', '/static/image/notebook.jpeg', 9.90 ), ( 2, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Mouse-Pad', 'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ', '/static/image/mouse-pad.jpeg', 8.80 ), ( 3, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt.jpeg', 6.60 ), ( 4, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-1.jpeg', 2.20 ), ( 5, '2023-12-06 15:26:19', '2023-12-09 22:32:35', 'Sweatshirt', 'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.', '/static/image/sweatshirt.jpeg', 1.10 ), ( 6, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-2.jpeg', 1.80 ), ( 7, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'mascot', 'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.', '/static/image/logo.jpg', 4.80 )\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product_category` (product_id,category_id) VALUES ( 1, 2 ), ( 2, 2 ), ( 3, 1 ), ( 4, 1 ), ( 5, 1 ), ( 6, 1 ),( 7, 2 )\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/model/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Category struct {\n\tBase\n\tName        string `json:\"name\"`\n\tDescription string `json:\"description\"`\n\n\tProducts []Product `json:\"product\" gorm:\"many2many:product_category\"`\n}\n\nfunc (c Category) TableName() string {\n\treturn \"category\"\n}\n\ntype CategoryQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (c CategoryQuery) GetProductsByCategoryName(name string) (categories []Category, err error) {\n\terr = c.db.WithContext(c.ctx).Model(&Category{}).Where(&Category{Name: name}).Preload(\"Products\").Find(&categories).Error\n\treturn\n}\n\nfunc NewCategoryQuery(ctx context.Context, db *gorm.DB) *CategoryQuery {\n\treturn &CategoryQuery{\n\t\tctx: ctx,\n\t\tdb:  db,\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/model/product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tBase\n\tName        string  `json:\"name\"`\n\tDescription string  `json:\"description\"`\n\tPicture     string  `json:\"picture\"`\n\tPrice       float32 `json:\"price\"`\n\n\tCategories []Category `json:\"categories\" gorm:\"many2many:product_category\"`\n}\n\nfunc (p Product) TableName() string {\n\treturn \"product\"\n}\n\ntype ProductQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (p ProductQuery) GetById(productId int) (product Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).First(&product, productId).Error\n\treturn\n}\n\nfunc (p ProductQuery) SearchProducts(q string) (products []*Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).Find(&products, \"name like ? or description like ?\",\n\t\t\"%\"+q+\"%\", \"%\"+q+\"%\",\n\t).Error\n\treturn\n}\n\nfunc NewProductQuery(ctx context.Context, db *gorm.DB) *ProductQuery {\n\treturn &ProductQuery{\n\t\tctx: ctx,\n\t\tdb:  db,\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetProductService struct {\n\tctx context.Context\n} // NewGetProductService new GetProductService\nfunc NewGetProductService(ctx context.Context) *GetProductService {\n\treturn &GetProductService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetProductService) Run(req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tif req.Id == 0 {\n\t\treturn nil, kerrors.NewGRPCBizStatusError(2004001, \"product id is required\")\n\t}\n\tproductQuery := model.NewProductQuery(s.ctx, mysql.DB)\n\n\tp, err := productQuery.GetById(int(req.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &product.GetProductResp{\n\t\tProduct: &product.Product{\n\t\t\tId:          uint32(p.ID),\n\t\t\tPicture:     p.Picture,\n\t\t\tPrice:       p.Price,\n\t\t\tDescription: p.Description,\n\t\t\tName:        p.Name,\n\t\t},\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/service/get_product_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\nfunc TestGetProduct_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewGetProductService(ctx)\n\t// init req and assert value\n\n\treq := &product.GetProductReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/service/list_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype ListProductsService struct {\n\tctx context.Context\n} // NewListProductsService new ListProductsService\nfunc NewListProductsService(ctx context.Context) *ListProductsService {\n\treturn &ListProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListProductsService) Run(req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\t// Finish your business logic.\n\tcategoryQuery := model.NewCategoryQuery(s.ctx, mysql.DB)\n\n\tc, err := categoryQuery.GetProductsByCategoryName(req.CategoryName)\n\tresp = &product.ListProductsResp{}\n\tfor _, v1 := range c {\n\t\tfor _, v := range v1.Products {\n\t\t\tresp.Products = append(resp.Products, &product.Product{\n\t\t\t\tId:          uint32(v.ID),\n\t\t\t\tName:        v.Name,\n\t\t\t\tDescription: v.Description,\n\t\t\t\tPicture:     v.Picture,\n\t\t\t\tPrice:       v.Price,\n\t\t\t})\n\t\t}\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/service/list_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\nfunc TestListProducts_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewListProductsService(ctx)\n\t// init req and assert value\n\n\treq := &product.ListProductsReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype SearchProductsService struct {\n\tctx context.Context\n} // NewSearchProductsService new SearchProductsService\nfunc NewSearchProductsService(ctx context.Context) *SearchProductsService {\n\treturn &SearchProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SearchProductsService) Run(req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\t// Finish your business logic.\n\tproductQuery := model.NewProductQuery(s.ctx, mysql.DB)\n\tproducts, err := productQuery.SearchProducts(req.Query)\n\tvar results []*product.Product\n\tfor _, v := range products {\n\t\tresults = append(results, &product.Product{\n\t\t\tId:          uint32(v.ID),\n\t\t\tName:        v.Name,\n\t\t\tDescription: v.Description,\n\t\t\tPicture:     v.Picture,\n\t\t\tPrice:       v.Price,\n\t\t})\n\t}\n\n\treturn &product.SearchProductsResp{Results: results}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/biz/service/search_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\nfunc TestSearchProducts_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewSearchProductsService(ctx)\n\t// init req and assert value\n\n\treq := &product.SearchProductsReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"product\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8882\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/product\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-20240512092514-6907fd96d3ca\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.3\n\tgo.uber.org/zap v1.27.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/protobuf v1.34.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638 h1:b7mQxlMUT7APPFecvzetyPC8fJCVOOnd0zMspF7jqwc=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240423095615-4bd94c002638/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.3 h1:fOAp1/uJG+ZtcITgZOfYFmTKPE7n4Vclj1wZFgRciUU=\ngithub.com/redis/go-redis/v9 v9.5.3/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY=\ngoogle.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/service\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\n// ProductCatalogServiceImpl implements the last service interface defined in the IDL.\ntype ProductCatalogServiceImpl struct{}\n\n// ListProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) ListProducts(ctx context.Context, req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\tresp, err = service.NewListProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetProduct implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) GetProduct(ctx context.Context, req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tresp, err = service.NewGetProductService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// SearchProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) SearchProducts(ctx context.Context, req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\tresp, err = service.NewSearchProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'product'\n  ToolVersion: 'v0.9.1'\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := productcatalogservice.NewServer(new(ProductCatalogServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}), server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/product\"\nexec \"$CURDIR/bin/product\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/script/product.sql",
    "content": "CREATE TABLE `category`\n(\n    `id`          int          NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)  NOT NULL,\n    `description` varchar(255) NOT NULL,\n    `created_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `category`\nVALUES (1, 'Clothes', 'Clothes', '2023-12-06 15:05:06', '2023-12-06 15:05:06'),\n       (2, 'Other', 'Other', '2023-12-06 15:05:06', '2023-12-06 15:05:06');\nCREATE TABLE `product`\n(\n    `id`          int            NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)    NOT NULL,\n    `description` varchar(255)   NOT NULL,\n    `picture`     varchar(255)   NOT NULL,\n    `price`       decimal(10, 2) NOT NULL,\n    `created_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product`\nVALUES (1, 'Notebook',\n        'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ',\n        '/static/image/notebook.jpeg', 9.90, '2023-12-06 15:26:19', '2023-12-09 22:29:10'),\n       (2, 'Mouse-Pad',\n        'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ',\n        '/static/image/mouse-pad.jpeg', 8.80, '2023-12-06 15:26:19', '2023-12-09 22:29:59'),\n       (3, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt.jpeg', 6.60, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (4, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-1.jpeg', 2.20, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (5, 'Sweatshirt',\n        'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.',\n        '/static/image/sweatshirt.jpeg', 1.10, '2023-12-06 15:26:19', '2023-12-09 22:32:35'),\n       (6, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-2.jpeg', 1.80, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (10, 'mascot',\n        'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.',\n        '/static/image/logo.jpg', 4.80, '2023-12-06 15:26:19', '2023-12-09 22:39:47');\nCREATE TABLE `product_category`\n(\n    `id`          int      NOT NULL AUTO_INCREMENT,\n    `product_id`  int      NOT NULL,\n    `category_id` int      NOT NULL,\n    `created_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product_category`\nVALUES (1, 1, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (2, 2, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (3, 3, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (4, 4, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (5, 5, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (6, 6, 1, '2023-12-06 15:27:30', '2023-12-09 22:41:47'),\n       (10, 10, 2, '2023-12-06 15:27:30', '2023-12-06 15:27:30');"
  },
  {
    "path": "gomall/tutorial/ch13/app/product/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"shop-product\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif conf.GetConf().Env != \"online\" {\n\t\terr = DB.AutoMigrate(&model.User{})\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tgorm.Model\n\tEmail          string `gorm:\"uniqueIndex;type:varchar(255) not null\"`\n\tPasswordHashed string `gorm:\"type:varchar(255) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n\nfunc Create(ctx context.Context, db *gorm.DB, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n\nfunc GetByEmail(ctx context.Context, db *gorm.DB, email string) (*User, error) {\n\tvar user User\n\terr := db.WithContext(ctx).Where(\"email = ?\", email).First(&user).Error\n\treturn &user, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\trow, err := model.GetByEmail(s.ctx, mysql.DB, req.Email)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(row.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &user.LoginResp{\n\t\tUserId: int32(row.ID),\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewLoginService(ctx)\n\t// init req and assert value\n\n\treq := &user.LoginReq{\n\t\tEmail:    \"1demo@damin.com\",\n\t\tPassword: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Email == \"\" || req.Password == \"\" || req.PasswordConfirm == \"\" {\n\t\treturn nil, errors.New(\"email or password is empty\")\n\t}\n\tif req.Password != req.PasswordConfirm {\n\t\treturn nil, errors.New(\"password not match\")\n\t}\n\tpasswordHashed, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(passwordHashed),\n\t}\n\terr = model.Create(s.ctx, mysql.DB, newUser)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\tgodotenv.Load(\"../../.env\")\n\tmysql.Init()\n\tctx := context.Background()\n\ts := NewRegisterService(ctx)\n\t// init req and assert value\n\n\treq := &user.RegisterReq{\n\t\tEmail:           \"1demo@damin.com\",\n\t\tPassword:        \"FJODIAFUFJO\",\n\t\tPasswordConfirm: \"FJODIAFUFJO\",\n\t}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8881\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace (\n\tgithub.com/apache/thrift => github.com/apache/thrift v0.13.0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n)\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.5.1\n\tgo.uber.org/zap v1.27.0\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.6\n\tgorm.io/gorm v1.25.10\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/hashicorp/consul/api v1.20.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.1 // indirect\n\tgithub.com/hashicorp/go-hclog v1.3.1 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.0.0 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.12 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.1 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.9.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.9.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.19.0 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgoogle.golang.org/protobuf v1.34.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66 h1:KHEWSTCleXom38JQodofbpY7HNR2KQ4+ypIurCPFy/A=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20240515092919-1f776656cb66/go.mod h1:naiLX9zwKBzVA41wtvvmtSZdbCihqIT9RnOb8GZv8A4=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1 h1:9uiog+9g0UxUGg2JwGuHMsRhrUcB6QjPKqRz7b7XVwQ=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20240508100819-2905e45155c1/go.mod h1:4k0fkqy3cCgQWmelsJc4oyIz2Uh8/P1iRa2BMuEO3lY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=\ngithub.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=\ngo.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=\ngo.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=\ngo.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=\ngo.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=\ngo.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=\ngo.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=\ngorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=\ngorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\ngorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=\ngorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.9.1'\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch13/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/tutorial/ch13/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(&model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/biz/dal/redis/init.go",
    "content": "package redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"uniqueIndex;type:varchar(128) not null\"`\n\tPassword string `gorm:\"type:varchar(64) not null\"`\n}\n\nfunc (User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\t// CURD\n\n\t// Create\n\t// mysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"jfiojffjsoij\"})\n\n\t// Update\n\t// mysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").Update(\"password\", \"22222222\")\n\n\t// Read\n\tvar row model.User\n\tmysql.DB.Model(&model.User{}).Where(\"email = ?\", \"demo@example.com\").First(&row)\n\n\tfmt.Printf(\"row: %+v\\n\", row)\n\n\t// Delete\n\t// mysql.DB.Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n\n\t// mysql.DB.Unscoped().Where(\"email = ?\", \"demo@example.com\").Delete(&model.User{})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.33.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"Echo\": kitex.NewMethodInfo(\n\t\techoHandler,\n\t\tnewEchoArgs,\n\t\tnewEchoResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\techoServiceInfo                = NewServiceInfo()\n\techoServiceInfoForClient       = NewServiceInfoForClient()\n\techoServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn echoServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn echoServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"pbapi\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.1\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler pbapi.Echo, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.9.1'\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.33.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=\ngoogle.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfoForClient(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"echo\": kitex.NewMethodInfo(\n\t\techoHandler,\n\t\tnewEchoEchoArgs,\n\t\tnewEchoEchoResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingNone),\n\t),\n}\n\nvar (\n\techoServiceInfo                = NewServiceInfo()\n\techoServiceInfoForClient       = NewServiceInfoForClient()\n\techoServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn echoServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn echoServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"api\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.9.1\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\toptions = append(options, server.WithCompatibleMiddlewareForUnary())\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler api.Echo, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.13). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else if err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\n\tvar _field string\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\t_field = v\n\t}\n\tp.Message = _field\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else if err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\n\tvar _field string\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\t_field = v\n\t}\n\tp.Message = _field\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else if err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\t_field := NewRequest()\n\tif err := _field.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\tp.Req = _field\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else if err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\t_field := NewResponse()\n\tif err := _field.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\tp.Success = _field\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.9.1'"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch13/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch13/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n      - MYSQL_DATABASE=demo_proto\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: \"redis:latest\"\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch13/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/cart\n\t./app/checkout\n\t./app/frontend\n\t./app/order\n\t./app/payment\n\t./app/product\n\t./app/user\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n    optional string raw_body = 50101;\n    optional string query = 50102;\n    optional string header = 50103;\n    optional string cookie = 50104;\n    optional string body = 50105;\n    optional string path = 50106;\n    optional string vd = 50107;\n    optional string form = 50108;\n    optional string js_conv = 50109;\n    optional string file_name = 50110;\n    optional string none = 50111;\n\n    // 50131~50160 used to extend field option by hz\n    optional string form_compatible = 50131;\n    optional string js_conv_compatible = 50132;\n    optional string file_name_compatible = 50133;\n    optional string none_compatible = 50134;\n    // 50135 is reserved to vt_compatible\n    // optional FieldRules vt_compatible = 50135;\n\n    optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n    optional string get = 50201;\n    optional string post = 50202;\n    optional string put = 50203;\n    optional string delete = 50204;\n    optional string patch = 50205;\n    optional string options = 50206;\n    optional string head = 50207;\n    optional string any = 50208;\n    optional string gen_path = 50301; // The path specified by the user when the client code is generated, with a higher priority than api_version\n    optional string api_version = 50302; // Specify the value of the :version variable in path when the client code is generated\n    optional string tag = 50303; // rpc tag, can be multiple, separated by commas\n    optional string name = 50304; // Name of rpc\n    optional string api_level = 50305; // Interface Level\n    optional string serializer = 50306; // Serialization method\n    optional string param = 50307; // Whether client requests take public parameters\n    optional string baseurl = 50308; // Baseurl used in ttnet routing\n    optional string handler_path = 50309; // handler_path specifies the path to generate the method\n\n    // 50331~50360 used to extend method option by hz\n    optional string handler_path_compatible = 50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n    optional int32 http_code = 50401;\n\n// 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n    optional string base_domain = 50402;\n\n    // 50731~50760 used to extend service option by hz\n    optional string base_domain_compatible = 50731;\n}\n\nextend google.protobuf.MessageOptions {\n    // optional FieldRules msg_vt = 50111;\n\n    optional string reserve = 50830;\n    // 550831 is reserved to msg_vt_compatible\n    // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/idl/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart;\n\noption go_package = \"/cart\";\n\nservice CartService {\n  rpc AddItem (AddItemReq) returns (AddItemResp) {}\n  rpc GetCart (GetCartReq) returns (GetCartResp) {}\n  rpc EmptyCart (EmptyCartReq) returns (EmptyCartResp) {}\n}\n\nmessage CartItem {\n    uint32 product_id = 1;\n    uint32 quantity = 2;\n}\n\nmessage AddItemReq {\n    uint32 user_id = 1;\n    CartItem item = 2;\n}\n\nmessage AddItemResp {}\n\nmessage GetCartReq {\n    uint32 user_id = 1;\n}\n\nmessage GetCartResp {\n    repeated CartItem items = 1;\n}\n\nmessage EmptyCartReq {\n    uint32 user_id = 1;\n}\n\nmessage EmptyCartResp {}"
  },
  {
    "path": "gomall/tutorial/ch13/idl/checkout.proto",
    "content": "syntax = \"proto3\";\n\npackage checkout;\n\nimport \"payment.proto\";\n\noption go_package = \"/checkout\";\n\nservice CheckoutService {\n    rpc Checkout(CheckoutReq) returns (CheckoutResp) {}\n}\n\nmessage CheckoutReq {\n    uint32 user_id = 1;\n    string firstname = 2;\n    string lastname = 3;\n    string email =4;\n    Address address = 5;\n    payment.CreditCardInfo credit_card = 6;\n}\n\nmessage Address {\n    string street_address = 1;\n    string city = 2;\n    string state = 3;\n    string country = 4;\n    string zip_code = 5;\n}\n\nmessage CheckoutResp {\n    string order_id = 1;\n    string transaction_id = 2;\n}"
  },
  {
    "path": "gomall/tutorial/ch13/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch13/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch13/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/auth\";\n\nmessage LoginReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string next = 3 [(api.query)=\"next\"];\n}\n\nmessage RegisterReq {\n    string email = 1 [(api.form)=\"email\"];\n    string password = 2 [(api.form)=\"password\"];\n    string password_confirm = 3 [(api.form)=\"password_confirm\"];\n}\n\nservice AuthService {\n   rpc login(LoginReq) returns(common.Empty) {\n      option (api.post) = \"/auth/login\";\n   }\n   rpc register(RegisterReq) returns(common.Empty) {\n    option (api.post) = \"/auth/register\";\n }\n rpc logout(common.Empty) returns(common.Empty) {\n    option (api.post) = \"/auth/logout\";\n }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/idl/frontend/cart_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.cart;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/cart\";\n\nservice CartService {\n    rpc AddCartItem(AddCartItemReq) returns (common.Empty) {\n        option (api.post) = \"/cart\";\n    }\n    rpc GetCart(common.Empty) returns (common.Empty) {\n        option (api.get) = \"/cart\";\n    }\n}\n\nmessage AddCartItemReq {\n    uint32 product_id = 1 [(api.form) = \"productId\"];\n    int32 product_num = 2 [(api.form) = \"productNum\"];\n}\n\n\n\n\n"
  },
  {
    "path": "gomall/tutorial/ch13/idl/frontend/category_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.category;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/category\";\n\nservice CategoryService {\n    rpc Category(CategoryReq) returns (common.Empty) {\n        option (api.get) = \"/category/:category\";\n    }\n}\n\nmessage CategoryReq {\n    string category = 1 [ (api.path) = \"category\"];\n}\n\n"
  },
  {
    "path": "gomall/tutorial/ch13/idl/frontend/checkout_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.checkout;\n\noption go_package = \"/frontend/checkout\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CheckoutReq {\n    string email = 1 [(api.form) = \"email\"];\n    string firstname = 2 [(api.form) = \"firstname\"];\n    string lastname = 3 [(api.form) = \"lastname\"];\n    string street = 4 [(api.form) = \"street\"];\n    string zipcode = 5 [(api.form) = \"zipcode\"];\n    string province = 6 [(api.form) = \"province\"];\n    string country = 7 [(api.form) = \"country\"];\n    string city = 8 [(api.form) = \"city\"];\n    string card_num = 9 [(api.form)=\"cardNum\"];\n    int32 expiration_month = 10 [(api.form)=\"expirationMonth\"];\n    int32 expiration_year = 11 [(api.form) = \"expirationYear\"];\n    int32 cvv = 12 [(api.form) = \"cvv\"];\n    string payment = 13 [(api.form)= \"payment\"];\n}\n\nservice CheckoutService {\n    rpc Checkout(common.Empty) returns (common.Empty) {\n        option (api.get) = \"/checkout\";\n    }\n    rpc CheckoutWaiting(CheckoutReq) returns (common.Empty) {\n        option (api.post) = \"/checkout/waiting\";\n    }\n    rpc CheckoutResult(common.Empty) returns (common.Empty) {\n        option (api.get) = \"/checkout/result\";\n    }\n}"
  },
  {
    "path": "gomall/tutorial/ch13/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\n\nmessage Empty {}"
  },
  {
    "path": "gomall/tutorial/ch13/idl/frontend/home.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.home;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/home\";\n\nservice HomeService {\n   rpc Home(common.Empty) returns(common.Empty) {\n      option (api.get) = \"/\";\n   }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/idl/frontend/order_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.order;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/order\";\n\nservice OrderService {\n   rpc OrderList(common.Empty) returns(common.Empty) {\n      option (api.get) = \"/order\";\n   }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/idl/frontend/product_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.product;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"/frontend/product\";\n\nservice ProductService {\n    rpc GetProduct(ProductReq) returns (common.Empty) {\n        option (api.get) = \"/product\";\n    }\n    rpc SearchProducts(SearchProductsReq) returns (common.Empty) {\n        option (api.get) = \"/search\";\n    }\n}\n\nmessage ProductReq {\n    uint32 id = 1 [ (api.query) = \"id\"];\n}\n\nmessage SearchProductsReq {\n    string q = 1 [(api.query) = \"q\"];\n}\n\n"
  },
  {
    "path": "gomall/tutorial/ch13/idl/order.proto",
    "content": "syntax = \"proto3\";\n\npackage order;\n\nimport \"cart.proto\";\n\noption go_package = \"/order\";\n\nservice OrderService {\n  rpc PlaceOrder (PlaceOrderReq) returns (PlaceOrderResp) {}\n  rpc ListOrder (ListOrderReq) returns (ListOrderResp) {}\n}\n\nmessage Address {\n    string street_address = 1;\n    string city = 2;\n    string state = 3;\n    string country = 4;\n    string zip_code = 5;\n}\n\nmessage OrderItem {\n    cart.CartItem item = 1;\n    float cost = 2;\n}\n\nmessage PlaceOrderReq {\n    uint32 user_id = 1;\n\n    Address address = 3;\n    string email = 4;\n    repeated OrderItem items = 5;\n}\n\nmessage OrderResult {\n    string order_id = 1;\n}\n\nmessage PlaceOrderResp {\n    OrderResult order = 1;\n}\n\nmessage ListOrderReq {\n    uint32 user_id = 1;\n}\n\nmessage Order {\n    repeated OrderItem items = 1;\n    string order_id = 2;\n    uint32 user_id = 3;\n    Address address = 4;\n    string email = 5;\n    int32 created_at = 6;\n}\n\nmessage ListOrderResp {\n    repeated Order orders = 1;\n}"
  },
  {
    "path": "gomall/tutorial/ch13/idl/payment.proto",
    "content": "syntax = \"proto3\";\n\npackage payment;\n\noption go_package =\"/payment\";\n\nservice PaymentService {\n    rpc Charge(ChargeReq) returns (ChargeResp) {}\n}\n\nmessage CreditCardInfo {\n    string credit_card_number = 1;\n    int32 credit_card_cvv = 2;\n    int32 credit_card_expiration_year = 3;\n    int32 credit_card_expiration_month = 4;\n}\n\nmessage ChargeReq {\n    float amount = 1;\n    CreditCardInfo credit_card = 2;\n    string order_id = 3;\n    uint32 user_id = 4;\n}\n\nmessage ChargeResp {\n    string transaction_id = 1;\n}"
  },
  {
    "path": "gomall/tutorial/ch13/idl/product.proto",
    "content": "syntax = \"proto3\";\n\npackage product;\n\noption go_package =\"/product\";\n\nservice ProductCatalogService {\n    rpc ListProducts(ListProductsReq) returns (ListProductsResp) {} ;\n    rpc GetProduct(GetProductReq) returns (GetProductResp) {};\n    rpc SearchProducts (SearchProductsReq) returns (SearchProductsResp) {} ;\n}\n\nmessage ListProductsReq {\n    int32 page = 1;\n    int32 page_size = 2;\n    string category_name = 3;\n}\n\nmessage Product {\n    uint32 id = 1;\n    string name = 2;\n    string description = 3;\n    string picture = 4;\n    float price = 5;\n\n    repeated string categories = 6;\n}\n\nmessage ListProductsResp {\n    repeated Product products = 1;\n}\n\nmessage GetProductReq {\n    uint32 id = 1;\n}\n\nmessage GetProductResp {\n    Product product = 1;\n}\n\nmessage SearchProductsReq {\n    string query = 1;\n}\n\nmessage SearchProductsResp {\n    repeated Product results = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/idl/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"/user\";\n\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string password_confirm = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email = 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n\nservice UserService {\n  rpc Register (RegisterReq) returns (RegisterResp) {}\n  rpc Login (LoginReq) returns (LoginResp) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.9.1\n\tgoogle.golang.org/protobuf v1.34.1\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.13.0 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect\n\tgithub.com/bytedance/sonic v1.11.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.18 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.2.0 // indirect\n\tgithub.com/cloudwego/frugal v0.1.14 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.6 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.8.2 // indirect\n\tgithub.com/tidwall/gjson v1.9.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A=\ngithub.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw=\ngithub.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg=\ngithub.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ=\ngithub.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s=\ngithub.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U=\ngithub.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw=\ngithub.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=\ngoogle.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/cart/cart.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CartItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CartItem[number], err)\n}\n\nfunc (x *CartItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.ProductId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CartItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Quantity, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_AddItemReq[number], err)\n}\n\nfunc (x *AddItemReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *AddItemResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *GetCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartReq[number], err)\n}\n\nfunc (x *GetCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartResp[number], err)\n}\n\nfunc (x *GetCartResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *EmptyCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmptyCartReq[number], err)\n}\n\nfunc (x *EmptyCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmptyCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *CartItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.ProductId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetProductId())\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Quantity == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 2, x.GetQuantity())\n\treturn offset\n}\n\nfunc (x *AddItemReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItem())\n\treturn offset\n}\n\nfunc (x *AddItemResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *GetCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *EmptyCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *CartItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CartItem) sizeField1() (n int) {\n\tif x.ProductId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetProductId())\n\treturn n\n}\n\nfunc (x *CartItem) sizeField2() (n int) {\n\tif x.Quantity == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(2, x.GetQuantity())\n\treturn n\n}\n\nfunc (x *AddItemReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField2() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetItem())\n\treturn n\n}\n\nfunc (x *AddItemResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nfunc (x *GetCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartResp) sizeField1() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(1, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *EmptyCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *EmptyCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_CartItem = map[int32]string{\n\t1: \"ProductId\",\n\t2: \"Quantity\",\n}\n\nvar fieldIDToName_AddItemReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Item\",\n}\n\nvar fieldIDToName_AddItemResp = map[int32]string{}\n\nvar fieldIDToName_GetCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartResp = map[int32]string{\n\t1: \"Items\",\n}\n\nvar fieldIDToName_EmptyCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_EmptyCartResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/cart/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: cart.proto\n\npackage cart\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\"`\n\tQuantity  uint32 `protobuf:\"varint,2,opt,name=quantity,proto3\" json:\"quantity,omitempty\"`\n}\n\nfunc (x *CartItem) Reset() {\n\t*x = CartItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartItem) ProtoMessage() {}\n\nfunc (x *CartItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartItem.ProtoReflect.Descriptor instead.\nfunc (*CartItem) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartItem) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetQuantity() uint32 {\n\tif x != nil {\n\t\treturn x.Quantity\n\t}\n\treturn 0\n}\n\ntype AddItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32    `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItem   *CartItem `protobuf:\"bytes,2,opt,name=item,proto3\" json:\"item,omitempty\"`\n}\n\nfunc (x *AddItemReq) Reset() {\n\t*x = AddItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemReq) ProtoMessage() {}\n\nfunc (x *AddItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddItemReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *AddItemReq) GetItem() *CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\ntype AddItemResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *AddItemResp) Reset() {\n\t*x = AddItemResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemResp) ProtoMessage() {}\n\nfunc (x *AddItemResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemResp.ProtoReflect.Descriptor instead.\nfunc (*AddItemResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{2}\n}\n\ntype GetCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *GetCartReq) Reset() {\n\t*x = GetCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReq) ProtoMessage() {}\n\nfunc (x *GetCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReq.ProtoReflect.Descriptor instead.\nfunc (*GetCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItems []*CartItem `protobuf:\"bytes,1,rep,name=items,proto3\" json:\"items,omitempty\"`\n}\n\nfunc (x *GetCartResp) Reset() {\n\t*x = GetCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartResp) ProtoMessage() {}\n\nfunc (x *GetCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartResp.ProtoReflect.Descriptor instead.\nfunc (*GetCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetCartResp) GetItems() []*CartItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\ntype EmptyCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *EmptyCartReq) Reset() {\n\t*x = EmptyCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartReq) ProtoMessage() {}\n\nfunc (x *EmptyCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartReq.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *EmptyCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype EmptyCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmptyCartResp) Reset() {\n\t*x = EmptyCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartResp) ProtoMessage() {}\n\nfunc (x *EmptyCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartResp.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{6}\n}\n\nvar File_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x08, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0a, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04,\n\t0x69, 0x74, 0x65, 0x6d, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x25, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65,\n\t0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0b, 0x47, 0x65,\n\t0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x24, 0x0a, 0x05, 0x69, 0x74, 0x65,\n\t0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22,\n\t0x27, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12,\n\t0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,\n\t0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x0f, 0x0a, 0x0d, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x32, 0xa9, 0x01, 0x0a, 0x0b, 0x43, 0x61,\n\t0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49,\n\t0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64,\n\t0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x07, 0x47,\n\t0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x47, 0x65,\n\t0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36, 0x0a,\n\t0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x12, 0x12, 0x2e, 0x63, 0x61, 0x72,\n\t0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x13,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69,\n\t0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70,\n\t0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f,\n\t0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_proto_rawDescOnce sync.Once\n\tfile_cart_proto_rawDescData = file_cart_proto_rawDesc\n)\n\nfunc file_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_proto_rawDescData)\n\t})\n\treturn file_cart_proto_rawDescData\n}\n\nvar file_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_cart_proto_goTypes = []interface{}{\n\t(*CartItem)(nil),      // 0: cart.CartItem\n\t(*AddItemReq)(nil),    // 1: cart.AddItemReq\n\t(*AddItemResp)(nil),   // 2: cart.AddItemResp\n\t(*GetCartReq)(nil),    // 3: cart.GetCartReq\n\t(*GetCartResp)(nil),   // 4: cart.GetCartResp\n\t(*EmptyCartReq)(nil),  // 5: cart.EmptyCartReq\n\t(*EmptyCartResp)(nil), // 6: cart.EmptyCartResp\n}\nvar file_cart_proto_depIdxs = []int32{\n\t0, // 0: cart.AddItemReq.item:type_name -> cart.CartItem\n\t0, // 1: cart.GetCartResp.items:type_name -> cart.CartItem\n\t1, // 2: cart.CartService.AddItem:input_type -> cart.AddItemReq\n\t3, // 3: cart.CartService.GetCart:input_type -> cart.GetCartReq\n\t5, // 4: cart.CartService.EmptyCart:input_type -> cart.EmptyCartReq\n\t2, // 5: cart.CartService.AddItem:output_type -> cart.AddItemResp\n\t4, // 6: cart.CartService.GetCart:output_type -> cart.GetCartResp\n\t6, // 7: cart.CartService.EmptyCart:output_type -> cart.EmptyCartResp\n\t5, // [5:8] is the sub-list for method output_type\n\t2, // [2:5] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_proto_init() }\nfunc file_cart_proto_init() {\n\tif File_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_proto = out.File\n\tfile_cart_proto_rawDesc = nil\n\tfile_cart_proto_goTypes = nil\n\tfile_cart_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\ntype CartService interface {\n\tAddItem(ctx context.Context, req *AddItemReq) (res *AddItemResp, err error)\n\tGetCart(ctx context.Context, req *GetCartReq) (res *GetCartResp, err error)\n\tEmptyCart(ctx context.Context, req *EmptyCartReq) (res *EmptyCartResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/cart/cartservice/cartservice.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"AddItem\": kitex.NewMethodInfo(\n\t\taddItemHandler,\n\t\tnewAddItemArgs,\n\t\tnewAddItemResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"GetCart\": kitex.NewMethodInfo(\n\t\tgetCartHandler,\n\t\tnewGetCartArgs,\n\t\tnewGetCartResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"EmptyCart\": kitex.NewMethodInfo(\n\t\temptyCartHandler,\n\t\tnewEmptyCartArgs,\n\t\tnewEmptyCartResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tcartServiceServiceInfo                = NewServiceInfo()\n\tcartServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tcartServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"CartService\"\n\thandlerType := (*cart.CartService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"cart\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.1\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc addItemHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.AddItemReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).AddItem(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *AddItemArgs:\n\t\tsuccess, err := handler.(cart.CartService).AddItem(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*AddItemResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newAddItemArgs() interface{} {\n\treturn &AddItemArgs{}\n}\n\nfunc newAddItemResult() interface{} {\n\treturn &AddItemResult{}\n}\n\ntype AddItemArgs struct {\n\tReq *cart.AddItemReq\n}\n\nfunc (p *AddItemArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.AddItemReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *AddItemArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *AddItemArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *AddItemArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar AddItemArgs_Req_DEFAULT *cart.AddItemReq\n\nfunc (p *AddItemArgs) GetReq() *cart.AddItemReq {\n\tif !p.IsSetReq() {\n\t\treturn AddItemArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *AddItemArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *AddItemArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype AddItemResult struct {\n\tSuccess *cart.AddItemResp\n}\n\nvar AddItemResult_Success_DEFAULT *cart.AddItemResp\n\nfunc (p *AddItemResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.AddItemResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *AddItemResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *AddItemResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *AddItemResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *AddItemResult) GetSuccess() *cart.AddItemResp {\n\tif !p.IsSetSuccess() {\n\t\treturn AddItemResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *AddItemResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.AddItemResp)\n}\n\nfunc (p *AddItemResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *AddItemResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.GetCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).GetCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *GetCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).GetCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetCartResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newGetCartArgs() interface{} {\n\treturn &GetCartArgs{}\n}\n\nfunc newGetCartResult() interface{} {\n\treturn &GetCartResult{}\n}\n\ntype GetCartArgs struct {\n\tReq *cart.GetCartReq\n}\n\nfunc (p *GetCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.GetCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetCartArgs_Req_DEFAULT *cart.GetCartReq\n\nfunc (p *GetCartArgs) GetReq() *cart.GetCartReq {\n\tif !p.IsSetReq() {\n\t\treturn GetCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetCartResult struct {\n\tSuccess *cart.GetCartResp\n}\n\nvar GetCartResult_Success_DEFAULT *cart.GetCartResp\n\nfunc (p *GetCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.GetCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetCartResult) GetSuccess() *cart.GetCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.GetCartResp)\n}\n\nfunc (p *GetCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc emptyCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.EmptyCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).EmptyCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *EmptyCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).EmptyCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EmptyCartResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newEmptyCartArgs() interface{} {\n\treturn &EmptyCartArgs{}\n}\n\nfunc newEmptyCartResult() interface{} {\n\treturn &EmptyCartResult{}\n}\n\ntype EmptyCartArgs struct {\n\tReq *cart.EmptyCartReq\n}\n\nfunc (p *EmptyCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.EmptyCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EmptyCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EmptyCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EmptyCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EmptyCartArgs_Req_DEFAULT *cart.EmptyCartReq\n\nfunc (p *EmptyCartArgs) GetReq() *cart.EmptyCartReq {\n\tif !p.IsSetReq() {\n\t\treturn EmptyCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EmptyCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EmptyCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EmptyCartResult struct {\n\tSuccess *cart.EmptyCartResp\n}\n\nvar EmptyCartResult_Success_DEFAULT *cart.EmptyCartResp\n\nfunc (p *EmptyCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.EmptyCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EmptyCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EmptyCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EmptyCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EmptyCartResult) GetSuccess() *cart.EmptyCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn EmptyCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EmptyCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.EmptyCartResp)\n}\n\nfunc (p *EmptyCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EmptyCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) AddItem(ctx context.Context, Req *cart.AddItemReq) (r *cart.AddItemResp, err error) {\n\tvar _args AddItemArgs\n\t_args.Req = Req\n\tvar _result AddItemResult\n\tif err = p.c.Call(ctx, \"AddItem\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetCart(ctx context.Context, Req *cart.GetCartReq) (r *cart.GetCartResp, err error) {\n\tvar _args GetCartArgs\n\t_args.Req = Req\n\tvar _result GetCartResult\n\tif err = p.c.Call(ctx, \"GetCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq) (r *cart.EmptyCartResp, err error) {\n\tvar _args EmptyCartArgs\n\t_args.Req = Req\n\tvar _result EmptyCartResult\n\tif err = p.c.Call(ctx, \"EmptyCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/cart/cartservice/client.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCartServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCartServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCartServiceClient) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.AddItem(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetCart(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.EmptyCart(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/cart/cartservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler cart.CartService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/cart/cartservice/server.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler cart.CartService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler cart.CartService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/checkout/checkout.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tfmt \"fmt\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CheckoutReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutReq[number], err)\n}\n\nfunc (x *CheckoutReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Firstname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Lastname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutReq) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v payment.CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutResp[number], err)\n}\n\nfunc (x *CheckoutResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutResp) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Firstname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetFirstname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Lastname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetLastname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField6(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 6, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField2(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField2() (n int) {\n\tif x.Firstname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetFirstname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField3() (n int) {\n\tif x.Lastname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetLastname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField6() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(6, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *CheckoutResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField2() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_CheckoutReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Firstname\",\n\t3: \"Lastname\",\n\t4: \"Email\",\n\t5: \"Address\",\n\t6: \"CreditCard\",\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_CheckoutResp = map[int32]string{\n\t1: \"OrderId\",\n\t2: \"TransactionId\",\n}\n\nvar _ = payment.File_payment_proto\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/checkout/checkout.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: checkout.proto\n\npackage checkout\n\nimport (\n\tcontext \"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId     uint32                  `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tFirstname  string                  `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\"`\n\tLastname   string                  `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\"`\n\tEmail      string                  `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tAddress    *Address                `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tCreditCard *payment.CreditCardInfo `protobuf:\"bytes,6,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckoutReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *CheckoutReq) GetCreditCard() *payment.CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       string `protobuf:\"bytes,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() string {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn \"\"\n}\n\ntype CheckoutResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId       string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tTransactionId string `protobuf:\"bytes,2,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *CheckoutResp) Reset() {\n\t*x = CheckoutResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutResp) ProtoMessage() {}\n\nfunc (x *CheckoutResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutResp.ProtoReflect.Descriptor instead.\nfunc (*CheckoutResp) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CheckoutResp) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_proto protoreflect.FileDescriptor\n\nvar file_checkout_proto_rawDesc = []byte{\n\t0x0a, 0x0e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x0d, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdd, 0x01, 0x0a, 0x0b, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65,\n\t0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,\n\t0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05,\n\t0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12,\n\t0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f,\n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,\n\t0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,\n\t0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79,\n\t0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x50, 0x0a, 0x0c, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,\n\t0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x4e, 0x0a,\n\t0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x3b, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x15, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_proto_rawDescOnce sync.Once\n\tfile_checkout_proto_rawDescData = file_checkout_proto_rawDesc\n)\n\nfunc file_checkout_proto_rawDescGZIP() []byte {\n\tfile_checkout_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_proto_rawDescData)\n\t})\n\treturn file_checkout_proto_rawDescData\n}\n\nvar file_checkout_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_checkout_proto_goTypes = []interface{}{\n\t(*CheckoutReq)(nil),            // 0: checkout.CheckoutReq\n\t(*Address)(nil),                // 1: checkout.Address\n\t(*CheckoutResp)(nil),           // 2: checkout.CheckoutResp\n\t(*payment.CreditCardInfo)(nil), // 3: payment.CreditCardInfo\n}\nvar file_checkout_proto_depIdxs = []int32{\n\t1, // 0: checkout.CheckoutReq.address:type_name -> checkout.Address\n\t3, // 1: checkout.CheckoutReq.credit_card:type_name -> payment.CreditCardInfo\n\t0, // 2: checkout.CheckoutService.Checkout:input_type -> checkout.CheckoutReq\n\t2, // 3: checkout.CheckoutService.Checkout:output_type -> checkout.CheckoutResp\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_proto_init() }\nfunc file_checkout_proto_init() {\n\tif File_checkout_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_proto = out.File\n\tfile_checkout_proto_rawDesc = nil\n\tfile_checkout_proto_goTypes = nil\n\tfile_checkout_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\ntype CheckoutService interface {\n\tCheckout(ctx context.Context, req *CheckoutReq) (res *CheckoutResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/checkout/checkoutservice/checkoutservice.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"Checkout\": kitex.NewMethodInfo(\n\t\tcheckoutHandler,\n\t\tnewCheckoutArgs,\n\t\tnewCheckoutResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tcheckoutServiceServiceInfo                = NewServiceInfo()\n\tcheckoutServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tcheckoutServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"CheckoutService\"\n\thandlerType := (*checkout.CheckoutService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"checkout\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.1\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc checkoutHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(checkout.CheckoutReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(checkout.CheckoutService).Checkout(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *CheckoutArgs:\n\t\tsuccess, err := handler.(checkout.CheckoutService).Checkout(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*CheckoutResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newCheckoutArgs() interface{} {\n\treturn &CheckoutArgs{}\n}\n\nfunc newCheckoutResult() interface{} {\n\treturn &CheckoutResult{}\n}\n\ntype CheckoutArgs struct {\n\tReq *checkout.CheckoutReq\n}\n\nfunc (p *CheckoutArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(checkout.CheckoutReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *CheckoutArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *CheckoutArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *CheckoutArgs) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar CheckoutArgs_Req_DEFAULT *checkout.CheckoutReq\n\nfunc (p *CheckoutArgs) GetReq() *checkout.CheckoutReq {\n\tif !p.IsSetReq() {\n\t\treturn CheckoutArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *CheckoutArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *CheckoutArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype CheckoutResult struct {\n\tSuccess *checkout.CheckoutResp\n}\n\nvar CheckoutResult_Success_DEFAULT *checkout.CheckoutResp\n\nfunc (p *CheckoutResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(checkout.CheckoutResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *CheckoutResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *CheckoutResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *CheckoutResult) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *CheckoutResult) GetSuccess() *checkout.CheckoutResp {\n\tif !p.IsSetSuccess() {\n\t\treturn CheckoutResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *CheckoutResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*checkout.CheckoutResp)\n}\n\nfunc (p *CheckoutResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *CheckoutResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq) (r *checkout.CheckoutResp, err error) {\n\tvar _args CheckoutArgs\n\t_args.Req = Req\n\tvar _result CheckoutResult\n\tif err = p.c.Call(ctx, \"Checkout\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/checkout/checkoutservice/client.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCheckoutServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCheckoutServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCheckoutServiceClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Checkout(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/checkout/checkoutservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler checkout.CheckoutService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/checkout/checkoutservice/server.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler checkout.CheckoutService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler checkout.CheckoutService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/order/order.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage order\n\nimport (\n\tfmt \"fmt\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *OrderItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderItem[number], err)\n}\n\nfunc (x *OrderItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v cart.CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Cost, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderReq[number], err)\n}\n\nfunc (x *PlaceOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *PlaceOrderReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *OrderResult) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderResult[number], err)\n}\n\nfunc (x *OrderResult) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderResp[number], err)\n}\n\nfunc (x *PlaceOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderResult\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Order = &v\n\treturn offset, nil\n}\n\nfunc (x *ListOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderReq[number], err)\n}\n\nfunc (x *ListOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Order[number], err)\n}\n\nfunc (x *Order) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tx.CreatedAt, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderResp[number], err)\n}\n\nfunc (x *ListOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Order\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Orders = append(x.Orders, &v)\n\treturn offset, nil\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *OrderItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItem())\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Cost == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 2, x.GetCost())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 3, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *OrderResult) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderResult) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Order == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrder())\n\treturn offset\n}\n\nfunc (x *ListOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField1(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField2(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField3(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 3, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField4(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 4, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField5(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField6(buf []byte) (offset int) {\n\tif x.CreatedAt == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 6, x.GetCreatedAt())\n\treturn offset\n}\n\nfunc (x *ListOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Orders == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrders() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrders()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *OrderItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField1() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetItem())\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField2() (n int) {\n\tif x.Cost == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(2, x.GetCost())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField3() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(3, x.GetAddress())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField5() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(5, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *OrderResult) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *OrderResult) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) sizeField1() (n int) {\n\tif x.Order == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetOrder())\n\treturn n\n}\n\nfunc (x *ListOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Order) sizeField1() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(1, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *Order) sizeField2() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *Order) sizeField3() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(3, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) sizeField4() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(4, x.GetAddress())\n\treturn n\n}\n\nfunc (x *Order) sizeField5() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetEmail())\n\treturn n\n}\n\nfunc (x *Order) sizeField6() (n int) {\n\tif x.CreatedAt == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(6, x.GetCreatedAt())\n\treturn n\n}\n\nfunc (x *ListOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderResp) sizeField1() (n int) {\n\tif x.Orders == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrders() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrders()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_OrderItem = map[int32]string{\n\t1: \"Item\",\n\t2: \"Cost\",\n}\n\nvar fieldIDToName_PlaceOrderReq = map[int32]string{\n\t1: \"UserId\",\n\t3: \"Address\",\n\t4: \"Email\",\n\t5: \"Items\",\n}\n\nvar fieldIDToName_OrderResult = map[int32]string{\n\t1: \"OrderId\",\n}\n\nvar fieldIDToName_PlaceOrderResp = map[int32]string{\n\t1: \"Order\",\n}\n\nvar fieldIDToName_ListOrderReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_Order = map[int32]string{\n\t1: \"Items\",\n\t2: \"OrderId\",\n\t3: \"UserId\",\n\t4: \"Address\",\n\t5: \"Email\",\n\t6: \"CreatedAt\",\n}\n\nvar fieldIDToName_ListOrderResp = map[int32]string{\n\t1: \"Orders\",\n}\n\nvar _ = cart.File_cart_proto\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/order/order.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: order.proto\n\npackage order\n\nimport (\n\tcontext \"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       string `protobuf:\"bytes,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() string {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn \"\"\n}\n\ntype OrderItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItem *cart.CartItem `protobuf:\"bytes,1,opt,name=item,proto3\" json:\"item,omitempty\"`\n\tCost float32        `protobuf:\"fixed32,2,opt,name=cost,proto3\" json:\"cost,omitempty\"`\n}\n\nfunc (x *OrderItem) Reset() {\n\t*x = OrderItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderItem) ProtoMessage() {}\n\nfunc (x *OrderItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderItem.ProtoReflect.Descriptor instead.\nfunc (*OrderItem) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *OrderItem) GetItem() *cart.CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\nfunc (x *OrderItem) GetCost() float32 {\n\tif x != nil {\n\t\treturn x.Cost\n\t}\n\treturn 0\n}\n\ntype PlaceOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId  uint32       `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tAddress *Address     `protobuf:\"bytes,3,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail   string       `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tItems   []*OrderItem `protobuf:\"bytes,5,rep,name=items,proto3\" json:\"items,omitempty\"`\n}\n\nfunc (x *PlaceOrderReq) Reset() {\n\t*x = PlaceOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderReq) ProtoMessage() {}\n\nfunc (x *PlaceOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderReq.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *PlaceOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *PlaceOrderReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *PlaceOrderReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\ntype OrderResult struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n}\n\nfunc (x *OrderResult) Reset() {\n\t*x = OrderResult{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderResult) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderResult) ProtoMessage() {}\n\nfunc (x *OrderResult) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderResult.ProtoReflect.Descriptor instead.\nfunc (*OrderResult) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *OrderResult) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\ntype PlaceOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrder *OrderResult `protobuf:\"bytes,1,opt,name=order,proto3\" json:\"order,omitempty\"`\n}\n\nfunc (x *PlaceOrderResp) Reset() {\n\t*x = PlaceOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderResp) ProtoMessage() {}\n\nfunc (x *PlaceOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderResp.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PlaceOrderResp) GetOrder() *OrderResult {\n\tif x != nil {\n\t\treturn x.Order\n\t}\n\treturn nil\n}\n\ntype ListOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ListOrderReq) Reset() {\n\t*x = ListOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderReq) ProtoMessage() {}\n\nfunc (x *ListOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderReq.ProtoReflect.Descriptor instead.\nfunc (*ListOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ListOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype Order struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItems     []*OrderItem `protobuf:\"bytes,1,rep,name=items,proto3\" json:\"items,omitempty\"`\n\tOrderId   string       `protobuf:\"bytes,2,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId    uint32       `protobuf:\"varint,3,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tAddress   *Address     `protobuf:\"bytes,4,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail     string       `protobuf:\"bytes,5,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tCreatedAt int32        `protobuf:\"varint,6,opt,name=created_at,json=createdAt,proto3\" json:\"created_at,omitempty\"`\n}\n\nfunc (x *Order) Reset() {\n\t*x = Order{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Order) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Order) ProtoMessage() {}\n\nfunc (x *Order) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Order.ProtoReflect.Descriptor instead.\nfunc (*Order) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Order) GetItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Order) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetCreatedAt() int32 {\n\tif x != nil {\n\t\treturn x.CreatedAt\n\t}\n\treturn 0\n}\n\ntype ListOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrders []*Order `protobuf:\"bytes,1,rep,name=orders,proto3\" json:\"orders,omitempty\"`\n}\n\nfunc (x *ListOrderResp) Reset() {\n\t*x = ListOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderResp) ProtoMessage() {}\n\nfunc (x *ListOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderResp.ProtoReflect.Descriptor instead.\nfunc (*ListOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ListOrderResp) GetOrders() []*Order {\n\tif x != nil {\n\t\treturn x.Orders\n\t}\n\treturn nil\n}\n\nvar File_order_proto protoreflect.FileDescriptor\n\nvar file_order_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x1a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a,\n\t0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,\n\t0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63,\n\t0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f,\n\t0x64, 0x65, 0x22, 0x43, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x12,\n\t0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,\n\t0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69,\n\t0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x02, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x90, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x63,\n\t0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65,\n\t0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,\n\t0x49, 0x64, 0x12, 0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05,\n\t0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x12, 0x26, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49,\n\t0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x28, 0x0a, 0x0b, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x22, 0x27, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xc2, 0x01, 0x0a, 0x05, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69,\n\t0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12,\n\t0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x35,\n\t0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12,\n\t0x24, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x0c, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x73, 0x32, 0x85, 0x01, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f,\n\t0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61,\n\t0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73,\n\t0x70, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72,\n\t0x12, 0x13, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3e, 0x5a,\n\t0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_order_proto_rawDescOnce sync.Once\n\tfile_order_proto_rawDescData = file_order_proto_rawDesc\n)\n\nfunc file_order_proto_rawDescGZIP() []byte {\n\tfile_order_proto_rawDescOnce.Do(func() {\n\t\tfile_order_proto_rawDescData = protoimpl.X.CompressGZIP(file_order_proto_rawDescData)\n\t})\n\treturn file_order_proto_rawDescData\n}\n\nvar file_order_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_order_proto_goTypes = []interface{}{\n\t(*Address)(nil),        // 0: order.Address\n\t(*OrderItem)(nil),      // 1: order.OrderItem\n\t(*PlaceOrderReq)(nil),  // 2: order.PlaceOrderReq\n\t(*OrderResult)(nil),    // 3: order.OrderResult\n\t(*PlaceOrderResp)(nil), // 4: order.PlaceOrderResp\n\t(*ListOrderReq)(nil),   // 5: order.ListOrderReq\n\t(*Order)(nil),          // 6: order.Order\n\t(*ListOrderResp)(nil),  // 7: order.ListOrderResp\n\t(*cart.CartItem)(nil),  // 8: cart.CartItem\n}\nvar file_order_proto_depIdxs = []int32{\n\t8, // 0: order.OrderItem.item:type_name -> cart.CartItem\n\t0, // 1: order.PlaceOrderReq.address:type_name -> order.Address\n\t1, // 2: order.PlaceOrderReq.items:type_name -> order.OrderItem\n\t3, // 3: order.PlaceOrderResp.order:type_name -> order.OrderResult\n\t1, // 4: order.Order.items:type_name -> order.OrderItem\n\t0, // 5: order.Order.address:type_name -> order.Address\n\t6, // 6: order.ListOrderResp.orders:type_name -> order.Order\n\t2, // 7: order.OrderService.PlaceOrder:input_type -> order.PlaceOrderReq\n\t5, // 8: order.OrderService.ListOrder:input_type -> order.ListOrderReq\n\t4, // 9: order.OrderService.PlaceOrder:output_type -> order.PlaceOrderResp\n\t7, // 10: order.OrderService.ListOrder:output_type -> order.ListOrderResp\n\t9, // [9:11] is the sub-list for method output_type\n\t7, // [7:9] is the sub-list for method input_type\n\t7, // [7:7] is the sub-list for extension type_name\n\t7, // [7:7] is the sub-list for extension extendee\n\t0, // [0:7] is the sub-list for field type_name\n}\n\nfunc init() { file_order_proto_init() }\nfunc file_order_proto_init() {\n\tif File_order_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_order_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderResult); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Order); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_proto_goTypes,\n\t\tDependencyIndexes: file_order_proto_depIdxs,\n\t\tMessageInfos:      file_order_proto_msgTypes,\n\t}.Build()\n\tFile_order_proto = out.File\n\tfile_order_proto_rawDesc = nil\n\tfile_order_proto_goTypes = nil\n\tfile_order_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\ntype OrderService interface {\n\tPlaceOrder(ctx context.Context, req *PlaceOrderReq) (res *PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, req *ListOrderReq) (res *ListOrderResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/order/orderservice/client.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kOrderServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kOrderServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kOrderServiceClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.PlaceOrder(ctx, Req)\n}\n\nfunc (p *kOrderServiceClient) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListOrder(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/order/orderservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler order.OrderService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/order/orderservice/orderservice.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"PlaceOrder\": kitex.NewMethodInfo(\n\t\tplaceOrderHandler,\n\t\tnewPlaceOrderArgs,\n\t\tnewPlaceOrderResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"ListOrder\": kitex.NewMethodInfo(\n\t\tlistOrderHandler,\n\t\tnewListOrderArgs,\n\t\tnewListOrderResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\torderServiceServiceInfo                = NewServiceInfo()\n\torderServiceServiceInfoForClient       = NewServiceInfoForClient()\n\torderServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn orderServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn orderServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn orderServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"OrderService\"\n\thandlerType := (*order.OrderService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"order\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.1\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc placeOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.PlaceOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).PlaceOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *PlaceOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).PlaceOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*PlaceOrderResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newPlaceOrderArgs() interface{} {\n\treturn &PlaceOrderArgs{}\n}\n\nfunc newPlaceOrderResult() interface{} {\n\treturn &PlaceOrderResult{}\n}\n\ntype PlaceOrderArgs struct {\n\tReq *order.PlaceOrderReq\n}\n\nfunc (p *PlaceOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.PlaceOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *PlaceOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *PlaceOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar PlaceOrderArgs_Req_DEFAULT *order.PlaceOrderReq\n\nfunc (p *PlaceOrderArgs) GetReq() *order.PlaceOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn PlaceOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *PlaceOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PlaceOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype PlaceOrderResult struct {\n\tSuccess *order.PlaceOrderResp\n}\n\nvar PlaceOrderResult_Success_DEFAULT *order.PlaceOrderResp\n\nfunc (p *PlaceOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.PlaceOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *PlaceOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *PlaceOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *PlaceOrderResult) GetSuccess() *order.PlaceOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn PlaceOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *PlaceOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.PlaceOrderResp)\n}\n\nfunc (p *PlaceOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PlaceOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc listOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.ListOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).ListOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *ListOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).ListOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListOrderResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newListOrderArgs() interface{} {\n\treturn &ListOrderArgs{}\n}\n\nfunc newListOrderResult() interface{} {\n\treturn &ListOrderResult{}\n}\n\ntype ListOrderArgs struct {\n\tReq *order.ListOrderReq\n}\n\nfunc (p *ListOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.ListOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListOrderArgs_Req_DEFAULT *order.ListOrderReq\n\nfunc (p *ListOrderArgs) GetReq() *order.ListOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn ListOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListOrderResult struct {\n\tSuccess *order.ListOrderResp\n}\n\nvar ListOrderResult_Success_DEFAULT *order.ListOrderResp\n\nfunc (p *ListOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.ListOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListOrderResult) GetSuccess() *order.ListOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.ListOrderResp)\n}\n\nfunc (p *ListOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq) (r *order.PlaceOrderResp, err error) {\n\tvar _args PlaceOrderArgs\n\t_args.Req = Req\n\tvar _result PlaceOrderResult\n\tif err = p.c.Call(ctx, \"PlaceOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) ListOrder(ctx context.Context, Req *order.ListOrderReq) (r *order.ListOrderResp, err error) {\n\tvar _args ListOrderArgs\n\t_args.Req = Req\n\tvar _result ListOrderResult\n\tif err = p.c.Call(ctx, \"ListOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/order/orderservice/server.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler order.OrderService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler order.OrderService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/payment/payment.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage payment\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CreditCardInfo) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CreditCardInfo[number], err)\n}\n\nfunc (x *CreditCardInfo) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardNumber, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardCvv, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationYear, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationMonth, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeReq[number], err)\n}\n\nfunc (x *ChargeReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Amount, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *ChargeReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeResp[number], err)\n}\n\nfunc (x *ChargeResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField1(buf []byte) (offset int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetCreditCardNumber())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetCreditCardCvv())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField3(buf []byte) (offset int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 3, x.GetCreditCardExpirationYear())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField4(buf []byte) (offset int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 4, x.GetCreditCardExpirationMonth())\n\treturn offset\n}\n\nfunc (x *ChargeReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Amount == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 1, x.GetAmount())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 4, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *ChargeResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField1() (n int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetCreditCardNumber())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField2() (n int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetCreditCardCvv())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField3() (n int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(3, x.GetCreditCardExpirationYear())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField4() (n int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(4, x.GetCreditCardExpirationMonth())\n\treturn n\n}\n\nfunc (x *ChargeReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField1() (n int) {\n\tif x.Amount == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(1, x.GetAmount())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField2() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField3() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField4() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(4, x.GetUserId())\n\treturn n\n}\n\nfunc (x *ChargeResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ChargeResp) sizeField1() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_CreditCardInfo = map[int32]string{\n\t1: \"CreditCardNumber\",\n\t2: \"CreditCardCvv\",\n\t3: \"CreditCardExpirationYear\",\n\t4: \"CreditCardExpirationMonth\",\n}\n\nvar fieldIDToName_ChargeReq = map[int32]string{\n\t1: \"Amount\",\n\t2: \"CreditCard\",\n\t3: \"OrderId\",\n\t4: \"UserId\",\n}\n\nvar fieldIDToName_ChargeResp = map[int32]string{\n\t1: \"TransactionId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/payment/payment.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: payment.proto\n\npackage payment\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CreditCardInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCreditCardNumber          string `protobuf:\"bytes,1,opt,name=credit_card_number,json=creditCardNumber,proto3\" json:\"credit_card_number,omitempty\"`\n\tCreditCardCvv             int32  `protobuf:\"varint,2,opt,name=credit_card_cvv,json=creditCardCvv,proto3\" json:\"credit_card_cvv,omitempty\"`\n\tCreditCardExpirationYear  int32  `protobuf:\"varint,3,opt,name=credit_card_expiration_year,json=creditCardExpirationYear,proto3\" json:\"credit_card_expiration_year,omitempty\"`\n\tCreditCardExpirationMonth int32  `protobuf:\"varint,4,opt,name=credit_card_expiration_month,json=creditCardExpirationMonth,proto3\" json:\"credit_card_expiration_month,omitempty\"`\n}\n\nfunc (x *CreditCardInfo) Reset() {\n\t*x = CreditCardInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreditCardInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreditCardInfo) ProtoMessage() {}\n\nfunc (x *CreditCardInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreditCardInfo.ProtoReflect.Descriptor instead.\nfunc (*CreditCardInfo) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreditCardInfo) GetCreditCardNumber() string {\n\tif x != nil {\n\t\treturn x.CreditCardNumber\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreditCardInfo) GetCreditCardCvv() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardCvv\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationMonth\n\t}\n\treturn 0\n}\n\ntype ChargeReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAmount     float32         `protobuf:\"fixed32,1,opt,name=amount,proto3\" json:\"amount,omitempty\"`\n\tCreditCard *CreditCardInfo `protobuf:\"bytes,2,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n\tOrderId    string          `protobuf:\"bytes,3,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId     uint32          `protobuf:\"varint,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ChargeReq) Reset() {\n\t*x = ChargeReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeReq) ProtoMessage() {}\n\nfunc (x *ChargeReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeReq.ProtoReflect.Descriptor instead.\nfunc (*ChargeReq) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ChargeReq) GetAmount() float32 {\n\tif x != nil {\n\t\treturn x.Amount\n\t}\n\treturn 0\n}\n\nfunc (x *ChargeReq) GetCreditCard() *CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\nfunc (x *ChargeReq) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *ChargeReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype ChargeResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTransactionId string `protobuf:\"bytes,1,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *ChargeResp) Reset() {\n\t*x = ChargeResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeResp) ProtoMessage() {}\n\nfunc (x *ChargeResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeResp.ProtoReflect.Descriptor instead.\nfunc (*ChargeResp) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ChargeResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_payment_proto protoreflect.FileDescriptor\n\nvar file_payment_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x12, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65,\n\t0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43,\n\t0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x76, 0x76, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x43, 0x76,\n\t0x76, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61, 0x72,\n\t0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f,\n\t0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x6e, 0x74,\n\t0x68, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12,\n\t0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52,\n\t0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69,\n\t0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,\n\t0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,\n\t0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75,\n\t0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61,\n\t0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x45, 0x0a, 0x0e, 0x50, 0x61,\n\t0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x06,\n\t0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x61, 0x79,\n\t0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_payment_proto_rawDescOnce sync.Once\n\tfile_payment_proto_rawDescData = file_payment_proto_rawDesc\n)\n\nfunc file_payment_proto_rawDescGZIP() []byte {\n\tfile_payment_proto_rawDescOnce.Do(func() {\n\t\tfile_payment_proto_rawDescData = protoimpl.X.CompressGZIP(file_payment_proto_rawDescData)\n\t})\n\treturn file_payment_proto_rawDescData\n}\n\nvar file_payment_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_payment_proto_goTypes = []interface{}{\n\t(*CreditCardInfo)(nil), // 0: payment.CreditCardInfo\n\t(*ChargeReq)(nil),      // 1: payment.ChargeReq\n\t(*ChargeResp)(nil),     // 2: payment.ChargeResp\n}\nvar file_payment_proto_depIdxs = []int32{\n\t0, // 0: payment.ChargeReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 1: payment.PaymentService.Charge:input_type -> payment.ChargeReq\n\t2, // 2: payment.PaymentService.Charge:output_type -> payment.ChargeResp\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_payment_proto_init() }\nfunc file_payment_proto_init() {\n\tif File_payment_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_payment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreditCardInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_payment_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_payment_proto_goTypes,\n\t\tDependencyIndexes: file_payment_proto_depIdxs,\n\t\tMessageInfos:      file_payment_proto_msgTypes,\n\t}.Build()\n\tFile_payment_proto = out.File\n\tfile_payment_proto_rawDesc = nil\n\tfile_payment_proto_goTypes = nil\n\tfile_payment_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\ntype PaymentService interface {\n\tCharge(ctx context.Context, req *ChargeReq) (res *ChargeResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/payment/paymentservice/client.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kPaymentServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kPaymentServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kPaymentServiceClient) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Charge(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/payment/paymentservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler payment.PaymentService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/payment/paymentservice/paymentservice.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"Charge\": kitex.NewMethodInfo(\n\t\tchargeHandler,\n\t\tnewChargeArgs,\n\t\tnewChargeResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tpaymentServiceServiceInfo                = NewServiceInfo()\n\tpaymentServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tpaymentServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"PaymentService\"\n\thandlerType := (*payment.PaymentService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"payment\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.1\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc chargeHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(payment.ChargeReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(payment.PaymentService).Charge(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *ChargeArgs:\n\t\tsuccess, err := handler.(payment.PaymentService).Charge(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ChargeResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newChargeArgs() interface{} {\n\treturn &ChargeArgs{}\n}\n\nfunc newChargeResult() interface{} {\n\treturn &ChargeResult{}\n}\n\ntype ChargeArgs struct {\n\tReq *payment.ChargeReq\n}\n\nfunc (p *ChargeArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(payment.ChargeReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ChargeArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ChargeArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ChargeArgs) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ChargeArgs_Req_DEFAULT *payment.ChargeReq\n\nfunc (p *ChargeArgs) GetReq() *payment.ChargeReq {\n\tif !p.IsSetReq() {\n\t\treturn ChargeArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ChargeArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ChargeArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ChargeResult struct {\n\tSuccess *payment.ChargeResp\n}\n\nvar ChargeResult_Success_DEFAULT *payment.ChargeResp\n\nfunc (p *ChargeResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(payment.ChargeResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ChargeResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ChargeResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ChargeResult) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ChargeResult) GetSuccess() *payment.ChargeResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ChargeResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ChargeResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*payment.ChargeResp)\n}\n\nfunc (p *ChargeResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ChargeResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Charge(ctx context.Context, Req *payment.ChargeReq) (r *payment.ChargeResp, err error) {\n\tvar _args ChargeArgs\n\t_args.Req = Req\n\tvar _result ChargeResult\n\tif err = p.c.Call(ctx, \"Charge\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/payment/paymentservice/server.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler payment.PaymentService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler payment.PaymentService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/product/product.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *ListProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsReq[number], err)\n}\n\nfunc (x *ListProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Page, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.PageSize, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CategoryName, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Product[number], err)\n}\n\nfunc (x *Product) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Name, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Description, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Picture, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Price, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v string\n\tv, offset, err = fastpb.ReadString(buf, _type)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Categories = append(x.Categories, v)\n\treturn offset, err\n}\n\nfunc (x *ListProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsResp[number], err)\n}\n\nfunc (x *ListProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Products = append(x.Products, &v)\n\treturn offset, nil\n}\n\nfunc (x *GetProductReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductReq[number], err)\n}\n\nfunc (x *GetProductReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetProductResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductResp[number], err)\n}\n\nfunc (x *GetProductResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Product = &v\n\treturn offset, nil\n}\n\nfunc (x *SearchProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsReq[number], err)\n}\n\nfunc (x *SearchProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Query, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *SearchProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsResp[number], err)\n}\n\nfunc (x *SearchProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Results = append(x.Results, &v)\n\treturn offset, nil\n}\n\nfunc (x *ListProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Page == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetPage())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.PageSize == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetPageSize())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.CategoryName == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetCategoryName())\n\treturn offset\n}\n\nfunc (x *Product) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField2(buf []byte) (offset int) {\n\tif x.Name == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetName())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField3(buf []byte) (offset int) {\n\tif x.Description == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetDescription())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField4(buf []byte) (offset int) {\n\tif x.Picture == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetPicture())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField5(buf []byte) (offset int) {\n\tif x.Price == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 5, x.GetPrice())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField6(buf []byte) (offset int) {\n\tif len(x.Categories) == 0 {\n\t\treturn offset\n\t}\n\tfor i := range x.GetCategories() {\n\t\toffset += fastpb.WriteString(buf[offset:], 6, x.GetCategories()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Products == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetProducts() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProducts()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *GetProductReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *GetProductResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Product == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProduct())\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Query == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetQuery())\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Results == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetResults() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetResults()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField1() (n int) {\n\tif x.Page == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetPage())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField2() (n int) {\n\tif x.PageSize == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetPageSize())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField3() (n int) {\n\tif x.CategoryName == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetCategoryName())\n\treturn n\n}\n\nfunc (x *Product) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Product) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *Product) sizeField2() (n int) {\n\tif x.Name == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetName())\n\treturn n\n}\n\nfunc (x *Product) sizeField3() (n int) {\n\tif x.Description == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetDescription())\n\treturn n\n}\n\nfunc (x *Product) sizeField4() (n int) {\n\tif x.Picture == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetPicture())\n\treturn n\n}\n\nfunc (x *Product) sizeField5() (n int) {\n\tif x.Price == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(5, x.GetPrice())\n\treturn n\n}\n\nfunc (x *Product) sizeField6() (n int) {\n\tif len(x.Categories) == 0 {\n\t\treturn n\n\t}\n\tfor i := range x.GetCategories() {\n\t\tn += fastpb.SizeString(6, x.GetCategories()[i])\n\t}\n\treturn n\n}\n\nfunc (x *ListProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListProductsResp) sizeField1() (n int) {\n\tif x.Products == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetProducts() {\n\t\tn += fastpb.SizeMessage(1, x.GetProducts()[i])\n\t}\n\treturn n\n}\n\nfunc (x *GetProductReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductReq) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *GetProductResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductResp) sizeField1() (n int) {\n\tif x.Product == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetProduct())\n\treturn n\n}\n\nfunc (x *SearchProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsReq) sizeField1() (n int) {\n\tif x.Query == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetQuery())\n\treturn n\n}\n\nfunc (x *SearchProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsResp) sizeField1() (n int) {\n\tif x.Results == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetResults() {\n\t\tn += fastpb.SizeMessage(1, x.GetResults()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_ListProductsReq = map[int32]string{\n\t1: \"Page\",\n\t2: \"PageSize\",\n\t3: \"CategoryName\",\n}\n\nvar fieldIDToName_Product = map[int32]string{\n\t1: \"Id\",\n\t2: \"Name\",\n\t3: \"Description\",\n\t4: \"Picture\",\n\t5: \"Price\",\n\t6: \"Categories\",\n}\n\nvar fieldIDToName_ListProductsResp = map[int32]string{\n\t1: \"Products\",\n}\n\nvar fieldIDToName_GetProductReq = map[int32]string{\n\t1: \"Id\",\n}\n\nvar fieldIDToName_GetProductResp = map[int32]string{\n\t1: \"Product\",\n}\n\nvar fieldIDToName_SearchProductsReq = map[int32]string{\n\t1: \"Query\",\n}\n\nvar fieldIDToName_SearchProductsResp = map[int32]string{\n\t1: \"Results\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/product/product.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: product.proto\n\npackage product\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPage         int32  `protobuf:\"varint,1,opt,name=page,proto3\" json:\"page,omitempty\"`\n\tPageSize     int32  `protobuf:\"varint,2,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\tCategoryName string `protobuf:\"bytes,3,opt,name=category_name,json=categoryName,proto3\" json:\"category_name,omitempty\"`\n}\n\nfunc (x *ListProductsReq) Reset() {\n\t*x = ListProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsReq) ProtoMessage() {}\n\nfunc (x *ListProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsReq.ProtoReflect.Descriptor instead.\nfunc (*ListProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListProductsReq) GetPage() int32 {\n\tif x != nil {\n\t\treturn x.Page\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetCategoryName() string {\n\tif x != nil {\n\t\treturn x.CategoryName\n\t}\n\treturn \"\"\n}\n\ntype Product struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          uint32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string   `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tPicture     string   `protobuf:\"bytes,4,opt,name=picture,proto3\" json:\"picture,omitempty\"`\n\tPrice       float32  `protobuf:\"fixed32,5,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tCategories  []string `protobuf:\"bytes,6,rep,name=categories,proto3\" json:\"categories,omitempty\"`\n}\n\nfunc (x *Product) Reset() {\n\t*x = Product{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Product) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Product) ProtoMessage() {}\n\nfunc (x *Product) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Product.ProtoReflect.Descriptor instead.\nfunc (*Product) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Product) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPicture() string {\n\tif x != nil {\n\t\treturn x.Picture\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPrice() float32 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetCategories() []string {\n\tif x != nil {\n\t\treturn x.Categories\n\t}\n\treturn nil\n}\n\ntype ListProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProducts []*Product `protobuf:\"bytes,1,rep,name=products,proto3\" json:\"products,omitempty\"`\n}\n\nfunc (x *ListProductsResp) Reset() {\n\t*x = ListProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsResp) ProtoMessage() {}\n\nfunc (x *ListProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsResp.ProtoReflect.Descriptor instead.\nfunc (*ListProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListProductsResp) GetProducts() []*Product {\n\tif x != nil {\n\t\treturn x.Products\n\t}\n\treturn nil\n}\n\ntype GetProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetProductReq) Reset() {\n\t*x = GetProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductReq) ProtoMessage() {}\n\nfunc (x *GetProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductReq.ProtoReflect.Descriptor instead.\nfunc (*GetProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetProductResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProduct *Product `protobuf:\"bytes,1,opt,name=product,proto3\" json:\"product,omitempty\"`\n}\n\nfunc (x *GetProductResp) Reset() {\n\t*x = GetProductResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductResp) ProtoMessage() {}\n\nfunc (x *GetProductResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductResp.ProtoReflect.Descriptor instead.\nfunc (*GetProductResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetProductResp) GetProduct() *Product {\n\tif x != nil {\n\t\treturn x.Product\n\t}\n\treturn nil\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *SearchProductsReq) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\ntype SearchProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*Product `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *SearchProductsResp) Reset() {\n\t*x = SearchProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsResp) ProtoMessage() {}\n\nfunc (x *SearchProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsResp.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SearchProductsResp) GetResults() []*Product {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_product_proto protoreflect.FileDescriptor\n\nvar file_product_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x67, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12,\n\t0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d,\n\t0x65, 0x22, 0x9f, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a,\n\t0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72,\n\t0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65,\n\t0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,\n\t0x69, 0x65, 0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65,\n\t0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22,\n\t0x40, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,\n\t0x73, 0x32, 0xec, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x61, 0x74,\n\t0x61, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x4c,\n\t0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e,\n\t0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72,\n\t0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73,\n\t0x70, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f,\n\t0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e,\n\t0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65,\n\t0x71, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72,\n\t0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63,\n\t0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d,\n\t0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_proto_rawDescOnce sync.Once\n\tfile_product_proto_rawDescData = file_product_proto_rawDesc\n)\n\nfunc file_product_proto_rawDescGZIP() []byte {\n\tfile_product_proto_rawDescOnce.Do(func() {\n\t\tfile_product_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_proto_rawDescData)\n\t})\n\treturn file_product_proto_rawDescData\n}\n\nvar file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_product_proto_goTypes = []interface{}{\n\t(*ListProductsReq)(nil),    // 0: product.ListProductsReq\n\t(*Product)(nil),            // 1: product.Product\n\t(*ListProductsResp)(nil),   // 2: product.ListProductsResp\n\t(*GetProductReq)(nil),      // 3: product.GetProductReq\n\t(*GetProductResp)(nil),     // 4: product.GetProductResp\n\t(*SearchProductsReq)(nil),  // 5: product.SearchProductsReq\n\t(*SearchProductsResp)(nil), // 6: product.SearchProductsResp\n}\nvar file_product_proto_depIdxs = []int32{\n\t1, // 0: product.ListProductsResp.products:type_name -> product.Product\n\t1, // 1: product.GetProductResp.product:type_name -> product.Product\n\t1, // 2: product.SearchProductsResp.results:type_name -> product.Product\n\t0, // 3: product.ProductCatalogService.ListProducts:input_type -> product.ListProductsReq\n\t3, // 4: product.ProductCatalogService.GetProduct:input_type -> product.GetProductReq\n\t5, // 5: product.ProductCatalogService.SearchProducts:input_type -> product.SearchProductsReq\n\t2, // 6: product.ProductCatalogService.ListProducts:output_type -> product.ListProductsResp\n\t4, // 7: product.ProductCatalogService.GetProduct:output_type -> product.GetProductResp\n\t6, // 8: product.ProductCatalogService.SearchProducts:output_type -> product.SearchProductsResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_product_proto_init() }\nfunc file_product_proto_init() {\n\tif File_product_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Product); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_proto_goTypes,\n\t\tDependencyIndexes: file_product_proto_depIdxs,\n\t\tMessageInfos:      file_product_proto_msgTypes,\n\t}.Build()\n\tFile_product_proto = out.File\n\tfile_product_proto_rawDesc = nil\n\tfile_product_proto_goTypes = nil\n\tfile_product_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\ntype ProductCatalogService interface {\n\tListProducts(ctx context.Context, req *ListProductsReq) (res *ListProductsResp, err error)\n\tGetProduct(ctx context.Context, req *GetProductReq) (res *GetProductResp, err error)\n\tSearchProducts(ctx context.Context, req *SearchProductsReq) (res *SearchProductsResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/product/productcatalogservice/client.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductCatalogServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductCatalogServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductCatalogServiceClient) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.SearchProducts(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/product/productcatalogservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductCatalogService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/product/productcatalogservice/productcatalogservice.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"ListProducts\": kitex.NewMethodInfo(\n\t\tlistProductsHandler,\n\t\tnewListProductsArgs,\n\t\tnewListProductsResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"GetProduct\": kitex.NewMethodInfo(\n\t\tgetProductHandler,\n\t\tnewGetProductArgs,\n\t\tnewGetProductResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"SearchProducts\": kitex.NewMethodInfo(\n\t\tsearchProductsHandler,\n\t\tnewSearchProductsArgs,\n\t\tnewSearchProductsResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tproductCatalogServiceServiceInfo                = NewServiceInfo()\n\tproductCatalogServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tproductCatalogServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"ProductCatalogService\"\n\thandlerType := (*product.ProductCatalogService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"product\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.1\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.ListProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).ListProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *ListProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).ListProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListProductsResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newListProductsArgs() interface{} {\n\treturn &ListProductsArgs{}\n}\n\nfunc newListProductsResult() interface{} {\n\treturn &ListProductsResult{}\n}\n\ntype ListProductsArgs struct {\n\tReq *product.ListProductsReq\n}\n\nfunc (p *ListProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.ListProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListProductsArgs_Req_DEFAULT *product.ListProductsReq\n\nfunc (p *ListProductsArgs) GetReq() *product.ListProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn ListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListProductsResult struct {\n\tSuccess *product.ListProductsResp\n}\n\nvar ListProductsResult_Success_DEFAULT *product.ListProductsResp\n\nfunc (p *ListProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.ListProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListProductsResult) GetSuccess() *product.ListProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.ListProductsResp)\n}\n\nfunc (p *ListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.GetProductReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).GetProduct(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *GetProductArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).GetProduct(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetProductResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newGetProductArgs() interface{} {\n\treturn &GetProductArgs{}\n}\n\nfunc newGetProductResult() interface{} {\n\treturn &GetProductResult{}\n}\n\ntype GetProductArgs struct {\n\tReq *product.GetProductReq\n}\n\nfunc (p *GetProductArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.GetProductReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetProductArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetProductArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetProductArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetProductArgs_Req_DEFAULT *product.GetProductReq\n\nfunc (p *GetProductArgs) GetReq() *product.GetProductReq {\n\tif !p.IsSetReq() {\n\t\treturn GetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetProductResult struct {\n\tSuccess *product.GetProductResp\n}\n\nvar GetProductResult_Success_DEFAULT *product.GetProductResp\n\nfunc (p *GetProductResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.GetProductResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetProductResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetProductResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetProductResult) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetProductResult) GetSuccess() *product.GetProductResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.GetProductResp)\n}\n\nfunc (p *GetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc searchProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.SearchProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).SearchProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *SearchProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).SearchProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SearchProductsResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newSearchProductsArgs() interface{} {\n\treturn &SearchProductsArgs{}\n}\n\nfunc newSearchProductsResult() interface{} {\n\treturn &SearchProductsResult{}\n}\n\ntype SearchProductsArgs struct {\n\tReq *product.SearchProductsReq\n}\n\nfunc (p *SearchProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.SearchProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SearchProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SearchProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SearchProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SearchProductsArgs_Req_DEFAULT *product.SearchProductsReq\n\nfunc (p *SearchProductsArgs) GetReq() *product.SearchProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn SearchProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SearchProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SearchProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SearchProductsResult struct {\n\tSuccess *product.SearchProductsResp\n}\n\nvar SearchProductsResult_Success_DEFAULT *product.SearchProductsResp\n\nfunc (p *SearchProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.SearchProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SearchProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SearchProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SearchProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SearchProductsResult) GetSuccess() *product.SearchProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SearchProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SearchProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.SearchProductsResp)\n}\n\nfunc (p *SearchProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SearchProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, Req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args ListProductsArgs\n\t_args.Req = Req\n\tvar _result ListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, Req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args GetProductArgs\n\t_args.Req = Req\n\tvar _result GetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq) (r *product.SearchProductsResp, err error) {\n\tvar _args SearchProductsArgs\n\t_args.Req = Req\n\tvar _result SearchProductsResult\n\tif err = p.c.Call(ctx, \"SearchProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/product/productcatalogservice/server.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductCatalogService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler product.ProductCatalogService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.PasswordConfirm, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetPasswordConfirm())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.PasswordConfirm == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetPasswordConfirm())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"PasswordConfirm\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.25.3\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tPasswordConfirm string `protobuf:\"bytes,3,opt,name=password_confirm,json=passwordConfirm,proto3\" json:\"password_confirm,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPasswordConfirm() string {\n\tif x != nil {\n\t\treturn x.PasswordConfirm\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n\nfunc RegisterService(svr server.Server, handler user.UserService, opts ...server.RegisterOption) error {\n\treturn svr.RegisterService(serviceInfo(), handler, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.9.1. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nvar errInvalidMessageType = errors.New(\"invalid message type for service method handler\")\n\nvar serviceMethods = map[string]kitex.MethodInfo{\n\t\"Register\": kitex.NewMethodInfo(\n\t\tregisterHandler,\n\t\tnewRegisterArgs,\n\t\tnewRegisterResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n\t\"Login\": kitex.NewMethodInfo(\n\t\tloginHandler,\n\t\tnewLoginArgs,\n\t\tnewLoginResult,\n\t\tfalse,\n\t\tkitex.WithStreamingMode(kitex.StreamingUnary),\n\t),\n}\n\nvar (\n\tuserServiceServiceInfo                = NewServiceInfo()\n\tuserServiceServiceInfoForClient       = NewServiceInfoForClient()\n\tuserServiceServiceInfoForStreamClient = NewServiceInfoForStreamClient()\n)\n\n// for server\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\n// for client\nfunc serviceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn userServiceServiceInfoForStreamClient\n}\n\n// for stream client\nfunc serviceInfoForClient() *kitex.ServiceInfo {\n\treturn userServiceServiceInfoForClient\n}\n\n// NewServiceInfo creates a new ServiceInfo containing all methods\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, true, true)\n}\n\n// NewServiceInfo creates a new ServiceInfo containing non-streaming methods\nfunc NewServiceInfoForClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(false, false, true)\n}\nfunc NewServiceInfoForStreamClient() *kitex.ServiceInfo {\n\treturn newServiceInfo(true, true, false)\n}\n\nfunc newServiceInfo(hasStreaming bool, keepStreamingMethods bool, keepNonStreamingMethods bool) *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{}\n\tfor name, m := range serviceMethods {\n\t\tif m.IsStreaming() && !keepStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tif !m.IsStreaming() && !keepNonStreamingMethods {\n\t\t\tcontinue\n\t\t}\n\t\tmethods[name] = m\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"user\",\n\t}\n\tif hasStreaming {\n\t\textra[\"streaming\"] = hasStreaming\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.9.1\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn st.SendMsg(resp)\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t\treturn nil\n\tdefault:\n\t\treturn errInvalidMessageType\n\t}\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/cart/cart_client.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() cartservice.Client\n\tService() string\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := cartservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient cartservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() cartservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\treturn c.kitexClient.AddItem(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\treturn c.kitexClient.GetCart(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\treturn c.kitexClient.EmptyCart(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/cart/cart_default.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc AddItem(ctx context.Context, req *cart.AddItemReq, callOptions ...callopt.Option) (resp *cart.AddItemResp, err error) {\n\tresp, err = defaultClient.AddItem(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"AddItem call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetCart(ctx context.Context, req *cart.GetCartReq, callOptions ...callopt.Option) (resp *cart.GetCartResp, err error) {\n\tresp, err = defaultClient.GetCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc EmptyCart(ctx context.Context, req *cart.EmptyCartReq, callOptions ...callopt.Option) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = defaultClient.EmptyCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"EmptyCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/cart/cart_init.go",
    "content": "package cart\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"cart\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/checkout/checkout_client.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() checkoutservice.Client\n\tService() string\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := checkoutservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient checkoutservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() checkoutservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\treturn c.kitexClient.Checkout(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/checkout/checkout_default.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Checkout(ctx context.Context, req *checkout.CheckoutReq, callOptions ...callopt.Option) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = defaultClient.Checkout(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Checkout call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/checkout/checkout_init.go",
    "content": "package checkout\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"checkout\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/order/order_client.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() orderservice.Client\n\tService() string\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := orderservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient orderservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() orderservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\treturn c.kitexClient.PlaceOrder(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\treturn c.kitexClient.ListOrder(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/order/order_default.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc PlaceOrder(ctx context.Context, req *order.PlaceOrderReq, callOptions ...callopt.Option) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = defaultClient.PlaceOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"PlaceOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc ListOrder(ctx context.Context, req *order.ListOrderReq, callOptions ...callopt.Option) (resp *order.ListOrderResp, err error) {\n\tresp, err = defaultClient.ListOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/order/order_init.go",
    "content": "package order\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"order\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/payment/payment_client.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() paymentservice.Client\n\tService() string\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := paymentservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient paymentservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() paymentservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\treturn c.kitexClient.Charge(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/payment/payment_default.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Charge(ctx context.Context, req *payment.ChargeReq, callOptions ...callopt.Option) (resp *payment.ChargeResp, err error) {\n\tresp, err = defaultClient.Charge(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Charge call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/payment/payment_init.go",
    "content": "package payment\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"payment\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/product/product_client.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() productcatalogservice.Client\n\tService() string\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := productcatalogservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient productcatalogservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() productcatalogservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\treturn c.kitexClient.ListProducts(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\treturn c.kitexClient.GetProduct(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\treturn c.kitexClient.SearchProducts(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/product/product_default.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (resp *product.ListProductsResp, err error) {\n\tresp, err = defaultClient.ListProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (resp *product.GetProductResp, err error) {\n\tresp, err = defaultClient.GetProduct(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetProduct call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc SearchProducts(ctx context.Context, req *product.SearchProductsReq, callOptions ...callopt.Option) (resp *product.SearchProductsResp, err error) {\n\tresp, err = defaultClient.SearchProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"SearchProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/product/product_init.go",
    "content": "package product\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"product\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch13/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/Makefile",
    "content": "export ROOT_MOD=github.com/cloudwego/biz-demo/gomall\n.PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl ../../idl/frontend/order_page.proto\n\n.PHONY: gen-user\ngen-user: \n\t@cd rpc_gen && cwgo client --type RPC --service user --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/user.proto\n\t@cd app/user && cwgo server --type RPC --service user --module ${ROOT_MOD}/app/user --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/user.proto\n\n.PHONY: gen-product\ngen-product: \n\t@cd rpc_gen && cwgo client --type RPC --service product --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/product.proto\n\t@cd app/product && cwgo server --type RPC --service product --module ${ROOT_MOD}/app/product --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/product.proto\n\n\n.PHONY: gen-cart\ngen-cart: \n\t@cd rpc_gen && cwgo client --type RPC --service cart --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/cart.proto\n\t@cd app/cart && cwgo server --type RPC --service cart --module ${ROOT_MOD}/app/cart --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/cart.proto\n\n\n.PHONY: gen-checkout\ngen-checkout: \n\t@cd rpc_gen && cwgo client --type RPC --service checkout --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/checkout.proto\n\t@cd app/checkout && cwgo server --type RPC --service checkout --module ${ROOT_MOD}/app/checkout --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/checkout.proto\n\n\n.PHONY: gen-payment\ngen-payment: \n\t@cd rpc_gen && cwgo client --type RPC --service payment --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/payment.proto\n\t@cd app/payment && cwgo server --type RPC --service payment --module ${ROOT_MOD}/app/payment --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/payment.proto\n\n.PHONY: gen-order\ngen-order: \n\t@cd rpc_gen && cwgo client --type RPC --service order --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/order.proto\n\t@cd app/order && cwgo server --type RPC --service order --module ${ROOT_MOD}/app/order --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/order.proto\n\n.PHONY: gen-email\ngen-email: \n\t@cd rpc_gen && cwgo client --type RPC --service email --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/email.proto\n\t@cd app/email && cwgo server --type RPC --service email --module ${ROOT_MOD}/app/email --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/email.proto"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\t//nolint:errcheck\n\t\tDB.AutoMigrate(\n\t\t\t&model.Cart{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/model/cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Cart struct {\n\tBase\n\tUserId    uint32 `json:\"user_id\"`\n\tProductId uint32 `json:\"product_id\"`\n\tQty       uint32 `json:\"qty\"`\n}\n\nfunc (c Cart) TableName() string {\n\treturn \"cart\"\n}\n\nfunc GetCartByUserId(db *gorm.DB, ctx context.Context, userId uint32) (cartList []*Cart, err error) {\n\terr = db.Debug().WithContext(ctx).Model(&Cart{}).Find(&cartList, \"user_id = ?\", userId).Error\n\treturn cartList, err\n}\n\nfunc AddCart(db *gorm.DB, ctx context.Context, c *Cart) error {\n\tvar find Cart\n\terr := db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).First(&find).Error\n\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\treturn err\n\t}\n\tif find.ID != 0 {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).UpdateColumn(\"qty\", gorm.Expr(\"qty+?\", c.Qty)).Error\n\t} else {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Create(c).Error\n\t}\n\treturn err\n}\n\nfunc EmptyCart(db *gorm.DB, ctx context.Context, userId uint32) error {\n\tif userId == 0 {\n\t\treturn errors.New(\"user_is is required\")\n\t}\n\treturn db.WithContext(ctx).Delete(&Cart{}, \"user_id = ?\", userId).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/model/cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/service/add_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype AddItemService struct {\n\tctx context.Context\n} // NewAddItemService new AddItemService\nfunc NewAddItemService(ctx context.Context) *AddItemService {\n\treturn &AddItemService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *AddItemService) Run(req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\t// Finish your business logic.\n\tgetProduct, err := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: req.Item.GetProductId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif getProduct.Product == nil || getProduct.Product.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40004, \"product not exist\")\n\t}\n\n\terr = model.AddCart(mysql.DB, s.ctx, &model.Cart{\n\t\tUserId:    req.UserId,\n\t\tProductId: req.Item.ProductId,\n\t\tQty:       uint32(req.Item.Quantity),\n\t})\n\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\n\treturn &cart.AddItemResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/service/add_item_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestAddItem_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/service/empty_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype EmptyCartService struct {\n\tctx context.Context\n} // NewEmptyCartService new EmptyCartService\nfunc NewEmptyCartService(ctx context.Context) *EmptyCartService {\n\treturn &EmptyCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EmptyCartService) Run(req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\t// Finish your business logic.\n\terr = model.EmptyCart(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn &cart.EmptyCartResp{}, kerrors.NewBizStatusError(50001, \"empty cart error\")\n\t}\n\n\treturn &cart.EmptyCartResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/service/empty_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestEmptyCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetCartService struct {\n\tctx context.Context\n} // NewGetCartService new GetCartService\nfunc NewGetCartService(ctx context.Context) *GetCartService {\n\treturn &GetCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetCartService) Run(req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\t// resp = &cart.Cart{}\n\t// Finish your business logic.\n\tcarts, err := model.GetCartByUserId(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\tvar items []*cart.CartItem\n\tfor _, v := range carts {\n\t\titems = append(items, &cart.CartItem{ProductId: v.ProductId, Quantity: int32(v.Qty)})\n\t}\n\n\treturn &cart.GetCartResp{Cart: &cart.Cart{UserId: req.GetUserId(), Items: items}}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/biz/service/get_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cart\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/cart\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/service\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\n// CartServiceImpl implements the last service interface defined in the IDL.\ntype CartServiceImpl struct{}\n\n// AddItem implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) AddItem(ctx context.Context, req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\tresp, err = service.NewAddItemService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) GetCart(ctx context.Context, req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\tresp, err = service.NewGetCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// EmptyCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) EmptyCart(ctx context.Context, req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = service.NewEmptyCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\tcartutils \"github.com/cloudwego/biz-demo/gomall/app/cart/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tProductClient productcatalogservice.Client\n\tonce          sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitProductClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcartutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcartutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'cart'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\trpc.InitClient()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := cartservice.NewServer(new(CartServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/cart\"\nexec \"$CURDIR/bin/cart\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/script/cart.sql",
    "content": "create table cart\n(\n    id         int auto_increment,\n    user_id    int      not null,\n    product_id int      not null,\n    qty        int      not null,\n    created_at datetime not null default current_timestamp,\n    updated_at datetime not null default current_timestamp on update current_timestamp,\n    constraint cart_pk primary key (id)\n);"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/cart/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\ntype CheckoutService struct {\n\tctx context.Context\n} // NewCheckoutService new CheckoutService\nfunc NewCheckoutService(ctx context.Context) *CheckoutService {\n\treturn &CheckoutService{ctx: ctx}\n}\n\n/*\n\tRun\n\n1. get cart\n2. calculate cart\n3. create order\n4. empty cart\n5. pay\n6. change order result\n7. finish\n*/\nfunc (s *CheckoutService) Run(req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\t// Finish your business logic.\n\t// Idempotent\n\t// get cart\n\tcartResult, err := rpc.CartClient.GetCart(s.ctx, &cart.GetCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\tklog.Error(err)\n\t\terr = fmt.Errorf(\"GetCart.err:%v\", err)\n\t\treturn\n\t}\n\tif cartResult == nil || cartResult.Cart == nil || len(cartResult.Cart.Items) == 0 {\n\t\terr = errors.New(\"cart is empty\")\n\t\treturn\n\t}\n\tvar (\n\t\toi    []*order.OrderItem\n\t\ttotal float32\n\t)\n\tfor _, cartItem := range cartResult.Cart.Items {\n\t\tproductResp, resultErr := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: cartItem.ProductId})\n\t\tif resultErr != nil {\n\t\t\tklog.Error(resultErr)\n\t\t\terr = resultErr\n\t\t\treturn\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\tcost := p.Price * float32(cartItem.Quantity)\n\t\ttotal += cost\n\t\toi = append(oi, &order.OrderItem{\n\t\t\tItem: &cart.CartItem{ProductId: cartItem.ProductId, Quantity: cartItem.Quantity},\n\t\t\tCost: cost,\n\t\t})\n\t}\n\t// create order\n\torderReq := &order.PlaceOrderReq{\n\t\tUserId:       req.UserId,\n\t\tUserCurrency: \"USD\",\n\t\tOrderItems:   oi,\n\t\tEmail:        req.Email,\n\t}\n\tif req.Address != nil {\n\t\taddr := req.Address\n\t\tzipCodeInt, _ := strconv.Atoi(addr.ZipCode)\n\t\torderReq.Address = &order.Address{\n\t\t\tStreetAddress: addr.StreetAddress,\n\t\t\tCity:          addr.City,\n\t\t\tCountry:       addr.Country,\n\t\t\tState:         addr.State,\n\t\t\tZipCode:       int32(zipCodeInt),\n\t\t}\n\t}\n\torderResult, err := rpc.OrderClient.PlaceOrder(s.ctx, orderReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"PlaceOrder.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(\"orderResult\", orderResult)\n\t// empty cart\n\temptyResult, err := rpc.CartClient.EmptyCart(s.ctx, &cart.EmptyCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\terr = fmt.Errorf(\"EmptyCart.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(emptyResult)\n\t// charge\n\tvar orderId string\n\tif orderResult != nil || orderResult.Order != nil {\n\t\torderId = orderResult.Order.OrderId\n\t}\n\tpayReq := &payment.ChargeReq{\n\t\tUserId:  req.UserId,\n\t\tOrderId: orderId,\n\t\tAmount:  total,\n\t\tCreditCard: &payment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CreditCard.CreditCardNumber,\n\t\t\tCreditCardExpirationYear:  req.CreditCard.CreditCardExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.CreditCard.CreditCardExpirationMonth,\n\t\t\tCreditCardCvv:             req.CreditCard.CreditCardCvv,\n\t\t},\n\t}\n\tpaymentResult, err := rpc.PaymentClient.Charge(s.ctx, payReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"Charge.err:%v\", err)\n\t\treturn\n\t}\n\tdata, _ := proto.Marshal(&email.EmailReq{\n\t\tFrom:        \"from@example.com\",\n\t\tTo:          req.Email,\n\t\tContentType: \"text/plain\",\n\t\tSubject:     \"You just created an order in CloudWeGo shop\",\n\t\tContent:     \"You just created an order in CloudWeGo shop\",\n\t})\n\tmsg := &nats.Msg{Subject: \"email\", Data: data}\n\t_ = mq.Nc.PublishMsg(msg)\n\n\tklog.Info(paymentResult)\n\t// change order state\n\tklog.Info(orderResult)\n\n\tresp = &checkout.CheckoutResp{\n\t\tOrderId:       orderId,\n\t\tTransactionId: paymentResult.TransactionId,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/biz/service/checkout_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCheckout_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"checkout\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/checkout\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.31.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/compress v1.17.4 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.7 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=\ngithub.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E=\ngithub.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8=\ngithub.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=\ngithub.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/service\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n)\n\n// CheckoutServiceImpl implements the last service interface defined in the IDL.\ntype CheckoutServiceImpl struct{}\n\n// PlaceOrder implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) PlaceOrder(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Checkout implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) Checkout(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(nats.DefaultURL)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\tcheckoututils \"github.com/cloudwego/biz-demo/gomall/app/checkout/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tCartClient    cartservice.Client\n\tProductClient productcatalogservice.Client\n\tPaymentClient paymentservice.Client\n\tOrderClient   orderservice.Client\n\n\tonce sync.Once\n\terr  error\n)\n\nvar commonOpts []client.Option\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitCartClient()\n\t\tinitProductClient()\n\t\tinitPaymentClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tif os.Getenv(\"REGISTRY_ENABLE\") == \"true\" {\n\t\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\t\tcheckoututils.MustHandleError(err)\n\t\topts = append(opts, client.WithResolver(r))\n\t} else {\n\t\topts = append(opts, client.WithHostPorts(\"localhost:8883\"))\n\t}\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t)\n\topts = append(opts, commonOpts...)\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initPaymentClient() {\n\tvar opts []client.Option\n\tif os.Getenv(\"REGISTRY_ENABLE\") == \"true\" {\n\t\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\t\tcheckoututils.MustHandleError(err)\n\t\topts = append(opts, client.WithResolver(r))\n\t} else {\n\t\topts = append(opts, client.WithHostPorts(\"localhost:8886\"))\n\t}\n\topts = append(opts, client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}), client.WithTransportProtocol(transport.GRPC), client.WithMetaHandler(transmeta.ClientHTTP2Handler))\n\topts = append(opts, commonOpts...)\n\tPaymentClient, err = paymentservice.NewClient(\"payment\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts, client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}), client.WithTransportProtocol(transport.GRPC), client.WithMetaHandler(transmeta.ClientHTTP2Handler))\n\topts = append(opts, commonOpts...)\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'checkout'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\trpc.InitClient()\n\tmq.Init()\n\n\topts := kitexInit()\n\n\tsvr := checkoutservice.NewServer(new(CheckoutServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tklog.SetLevel(conf.LogLevel())\n\tklog.SetOutput(os.Stdout)\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/checkout\"\nexec \"$CURDIR/bin/checkout\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/checkout/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/biz/consumer/consumer.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage consumer\n\nimport \"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer/email\"\n\nfunc Init() {\n\temail.ConsumerInit()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/biz/consumer/email/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/notify\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc ConsumerInit() {\n\t// Connect to a server\n\n\tsub, err := mq.Nc.Subscribe(\"email\", func(m *nats.Msg) {\n\t\tvar req email.EmailReq\n\t\terr := proto.Unmarshal(m.Data, &req)\n\t\tif err != nil {\n\t\t\tklog.Error(err)\n\t\t}\n\t\tnoopEmail := notify.NewNoopEmail()\n\t\t_ = noopEmail.Send(&req)\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tserver.RegisterShutdownHook(func() {\n\t\tsub.Unsubscribe() //nolint:errcheck\n\t\tmq.Nc.Close()\n\t})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/biz/consumer/email/email_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nfunc TestEmailConsumer(t *testing.T) {\n\t// Connect to a server\n\tnc, _ := nats.Connect(nats.DefaultURL)\n\tdefer nc.Close()\n\n\tdata, err := proto.Marshal(&email.EmailReq{\n\t\tFrom:        \"hello@example.com\",\n\t\tTo:          \"to@example.com\",\n\t\tContentType: \"text/plain\",\n\t\tSubject:     \"hello world\",\n\t\tContent:     \"hello world\",\n\t})\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\terr = nc.PublishMsg(&nats.Msg{Subject: \"email\", Data: data})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/biz/service/send.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\ntype SendService struct {\n\tctx context.Context\n} // NewSendService new SendService\nfunc NewSendService(ctx context.Context) *SendService {\n\treturn &SendService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SendService) Run(req *email.EmailReq) (resp *email.EmailResp, err error) {\n\t// Finish your business logic.\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/biz/service/send_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc TestSend_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewSendService(ctx)\n\t// init req and assert value\n\n\treq := &email.EmailReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"email\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/email\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.31.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/compress v1.17.4 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.7 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=\ngithub.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E=\ngithub.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8=\ngithub.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=\ngithub.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/service\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\n// EmailServiceImpl implements the last service interface defined in the IDL.\ntype EmailServiceImpl struct{}\n\n// Send implements the EmailServiceImpl interface.\nfunc (s *EmailServiceImpl) Send(ctx context.Context, req *email.EmailReq) (resp *email.EmailResp, err error) {\n\tresp, err = service.NewSendService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(nats.DefaultURL)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/infra/notify/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage notify\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/kr/pretty\"\n)\n\ntype NoopEmail struct{}\n\nfunc (e *NoopEmail) Send(req *email.EmailReq) error {\n\tpretty.Printf(\"%v\\n\", req)\n\treturn nil\n}\n\nfunc NewNoopEmail() NoopEmail {\n\treturn NoopEmail{}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'email'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tmq.Init()\n\tconsumer.Init()\n\tsvr := emailservice.NewServer(new(EmailServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/email/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/email\"\nexec \"$CURDIR/bin/email\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(resp))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect := \"/\"\n\n\tc.Redirect(consts.StatusFound, []byte(redirect))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/cart/cart_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// AddCartItem .\n// @router /cart [POST]\nfunc AddCartItem(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req cart.AddCartReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\t_, err = service.NewAddCartItemService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(\"/cart\"))\n}\n\n// GetCart .\n// @router /cart [GET]\nfunc GetCart(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetCartService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/cart/cart_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestAddCartItem(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/cart\", AddCartItem)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestGetCart(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/cart\", GetCart)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/category/category_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Category .\n// @router /category/:category [GET]\nfunc Category(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req category.CategoryReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewCategoryService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"category\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/category/category_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCategory(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/category/:category\", Category)\n\tpath := \"/category/:category\"                             // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/checkout/checkout_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Checkout .\n// @router /checkout [GET]\nfunc Checkout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutWaiting .\n// @router /checkout/waiting [POST]\nfunc CheckoutWaiting(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutWaitingService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutResult .\n// @router /checkout/result [GET]\nfunc CheckoutResult(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutResultService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"result\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/checkout/checkout_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCheckout(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout\", Checkout)\n\tpath := \"/checkout\"                                       // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutWaiting(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/checkout/waiting\", CheckoutWaiting)\n\tpath := \"/checkout/waiting\"                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutResult(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout/result\", CheckoutResult)\n\tpath := \"/checkout/result\"                                // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t// resp, err :=\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/order/order_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// OrderList .\n// @router /order [GET]\nfunc OrderList(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewOrderListService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"order\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"order\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/order/order_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestOrderList(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/order\", OrderList)\n\tpath := \"/order\"                                          // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/product/product_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetProduct .\n// @router /product [GET]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.ProductReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetProductService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"product\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/handler/product/product_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetProduct(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/product\", GetProduct)\n\tpath := \"/product\"                                        // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/cart/cart_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.POST(\"/cart\", append(_addcartitemMw(), cart.AddCartItem)...)\n\troot.GET(\"/cart\", append(_getcartMw(), cart.GetCart)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/cart/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage cart\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n\n}\n\nfunc _addcartitemMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getcartMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/category/category_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage category\n\nimport (\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/category\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_category := root.Group(\"/category\", _categoryMw()...)\n\t\t_category.GET(\"/:category\", append(_category0Mw(), category.Category)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/category/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage category\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _categoryMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _category0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/checkout/checkout_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/checkout\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/checkout\", append(_checkout0Mw(), checkout.Checkout)...)\n\t_checkout := root.Group(\"/checkout\", _checkoutMw()...)\n\t_checkout.GET(\"/result\", append(_checkoutresultMw(), checkout.CheckoutResult)...)\n\t_checkout.POST(\"/waiting\", append(_checkoutwaitingMw(), checkout.CheckoutWaiting)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/checkout/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage checkout\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkout0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutresultMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutwaitingMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/order/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage order\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _orderlistMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/order/order_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage order\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/order\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/order\", append(_orderlistMw(), order.OrderList)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/product/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage product\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getproductMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/product/product_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage product\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/product\", append(_getproductMw(), product.GetProduct)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/cart\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/category\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/checkout\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/order\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\torder.Register(r)\n\n\tcheckout.Register(r)\n\n\tcart.Register(r)\n\n\tproduct.Register(r)\n\n\tcategory.Register(r)\n\n\tauth.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/add_cart_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype AddCartItemService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewAddCartItemService(Context context.Context, RequestContext *app.RequestContext) *AddCartItemService {\n\treturn &AddCartItemService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *AddCartItemService) Run(req *cart.AddCartReq) (resp *common.Empty, err error) {\n\t_, err = rpc.CartClient.AddItem(h.Context, &rpccart.AddItemReq{\n\t\tUserId: frontendutils.GetUserIdFromCtx(h.Context),\n\t\tItem: &rpccart.CartItem{\n\t\t\tProductId: req.ProductId,\n\t\t\tQuantity:  req.ProductNum,\n\t\t},\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CategoryService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCategoryService(Context context.Context, RequestContext *app.RequestContext) *CategoryService {\n\treturn &CategoryService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CategoryService) Run(req *category.CategoryReq) (resp map[string]any, err error) {\n\tp, _ := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{CategoryName: req.Category})\n\treturn utils.H{\n\t\t\"title\":    \"Category\",\n\t\t\"items\":    p.Products,\n\t\t\"cart_num\": 10,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutService(Context context.Context, RequestContext *app.RequestContext) *CheckoutService {\n\treturn &CheckoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.ProductId})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":    p.Name,\n\t\t\t\"Price\":   strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\": p.Picture,\n\t\t\t\"Qty\":     strconv.Itoa(int(v.Quantity)),\n\t\t})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"Checkout\",\n\t\t\"items\":    items,\n\t\t\"cart_num\": len(items),\n\t\t\"total\":    strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/checkout_result.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype CheckoutResultService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutResultService(Context context.Context, RequestContext *app.RequestContext) *CheckoutResultService {\n\treturn &CheckoutResultService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutResultService) Run(req *common.Empty) (resp map[string]any, err error) {\n\treturn utils.H{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/checkout_waiting.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\trpcpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutWaitingService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutWaitingService(Context context.Context, RequestContext *app.RequestContext) *CheckoutWaitingService {\n\treturn &CheckoutWaitingService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutWaitingService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\t_, err = rpc.CheckoutClient.Checkout(h.Context, &rpccheckout.CheckoutReq{\n\t\tUserId:    userId,\n\t\tEmail:     req.Email,\n\t\tFirstname: req.Firstname,\n\t\tLastname:  req.Lastname,\n\t\tAddress: &rpccheckout.Address{\n\t\t\tCountry:       req.Country,\n\t\t\tZipCode:       req.Zipcode,\n\t\t\tCity:          req.City,\n\t\t\tState:         req.Province,\n\t\t\tStreetAddress: req.Street,\n\t\t},\n\t\tCreditCard: &rpcpayment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CardNum,\n\t\t\tCreditCardExpirationYear:  req.ExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.ExpirationMonth,\n\t\t\tCreditCardCvv:             req.Cvv,\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"waiting\",\n\t\t\"redirect\": \"/checkout/result\",\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetCartService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetCartService(Context context.Context, RequestContext *app.RequestContext) *GetCartService {\n\treturn &GetCartService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetCartService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{\n\t\tUserId: uint32(h.Context.Value(frontendutils.UserIdKey).(float64)),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.GetProductId()})\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\"Name\": p.Name, \"Description\": p.Description, \"Picture\": p.Picture, \"Price\": strconv.FormatFloat(float64(p.Price), 'f', 2, 64), \"Qty\": strconv.Itoa(int(v.Quantity))})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Cart\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetProductService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetProductService(Context context.Context, RequestContext *app.RequestContext) *GetProductService {\n\treturn &GetProductService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetProductService) Run(req *product.ProductReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: req.GetId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"item\": p.Product,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (res map[string]any, err error) {\n\tctx := h.Context\n\tp, err := rpc.ProductClient.ListProducts(ctx, &product.ListProductsReq{})\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n\tvar cartNum int\n\treturn utils.H{\n\t\t\"title\":    \"Hot sale\",\n\t\t\"cart_num\": cartNum,\n\t\t\"items\":    p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (resp string, err error) {\n\tres, err := rpc.UserClient.Login(h.Context, &rpcuser.LoginReq{Email: req.Email, Password: req.Password})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\tfrontendutils.MustHandleError(err)\n\tredirect := \"/\"\n\tif frontendutils.ValidateNext(req.Next) {\n\t\tredirect = req.Next\n\t}\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn redirect, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\tsession.Save() //nolint:errcheck\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/order_list.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/types\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcorder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype OrderListService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewOrderListService(Context context.Context, RequestContext *app.RequestContext) *OrderListService {\n\treturn &OrderListService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *OrderListService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\tvar orders []*types.Order\n\tlistOrderResp, err := rpc.OrderClient.ListOrder(h.Context, &rpcorder.ListOrderReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif listOrderResp == nil || len(listOrderResp.Orders) == 0 {\n\t\treturn utils.H{\n\t\t\t\"title\":  \"Order\",\n\t\t\t\"orders\": orders,\n\t\t}, nil\n\t}\n\n\tfor _, v := range listOrderResp.Orders {\n\t\tvar items []types.OrderItem\n\t\tvar total float32\n\t\tif len(v.OrderItems) > 0 {\n\t\t\tfor _, vv := range v.OrderItems {\n\t\t\t\ttotal += vv.Cost\n\t\t\t\ti := vv.Item\n\t\t\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: i.ProductId})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif productResp.Product == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tp := productResp.Product\n\t\t\t\titems = append(items, types.OrderItem{\n\t\t\t\t\tProductId:   i.ProductId,\n\t\t\t\t\tQty:         uint32(i.Quantity),\n\t\t\t\t\tProductName: p.Name,\n\t\t\t\t\tPicture:     p.Picture,\n\t\t\t\t\tCost:        vv.Cost,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\ttimeObj := time.Unix(int64(v.CreatedAt), 0)\n\t\torders = append(orders, &types.Order{\n\t\t\tCost:        total,\n\t\t\tItems:       items,\n\t\t\tCreatedDate: timeObj.Format(\"2006-01-02 15:04:05\"),\n\t\t\tOrderId:     v.OrderId,\n\t\t\tConsignee:   types.Consignee{Email: v.Email},\n\t\t})\n\t}\n\n\treturn utils.H{\n\t\t\"title\":  \"Order\",\n\t\t\"orders\": orders,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\tres, err := rpc.UserClient.Register(h.Context, &rpcuser.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tConfirmPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tvar cartNum int\n\tuserId := frontendutils.GetUserIdFromCtx(ctx)\n\tcartResp, _ := rpc.CartClient.GetCart(ctx, &cart.GetCartReq{UserId: userId})\n\tif cartResp != nil && cartResp.Cart != nil {\n\t\tcartNum = len(cartResp.Cart.Items)\n\t}\n\tcontent[\"user_id\"] = ctx.Value(frontendutils.UserIdKey)\n\tcontent[\"cart_num\"] = cartNum\n\treturn content\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     int    `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.7.3\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3\n\tgithub.com/hertz-contrib/pprof v0.1.1\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.3.5/go.mod h1:V973WhNhGmvHxW6nQmsHEfHaoU9F3zTF+93rH03hcUQ=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.3.2/go.mod h1:hnv3B7eZ6kMv7CKFHT2OC4LU0mA4s5XPyu/SbixLcrU=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.6/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b h1:RoBp+TurP+46VZl31VMV+6wO2SlNlXwyVwjc93s5/tI=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/hertz-contrib/pprof v0.1.1 h1:x7kOFUtqkveXbDbiISIFE3x02cAtcb6/DBjHgsJmYcM=\ngithub.com/hertz-contrib/pprof v0.1.1/go.mod h1:9g23VQrcC4AjW++VA2relquyMXPVfs/s+t5FBIjIIOs=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50732,\n\t\tName:          \"api.service_path\",\n\t\tTag:           \"bytes,50732,opt,name=service_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is\n\t// generated, with a higher priority than api_version\n\t//\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the\n\t// client code is generated\n\t//\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n\t// optional string service_path = 50732;\n\tE_ServicePath = &file_api_proto_extTypes[37]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[38]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x47, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xac, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a,\n\t0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t3,  // 37: api.service_path:extendee -> google.protobuf.ServiceOptions\n\t4,  // 38: api.reserve:extendee -> google.protobuf.MessageOptions\n\t39, // [39:39] is the sub-list for method output_type\n\t39, // [39:39] is the sub-list for method input_type\n\t39, // [39:39] is the sub-list for extension type_name\n\t0,  // [0:39] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 39,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\" form:\"confirm_password\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52,\n\t0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a,\n\t0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb, 0x18, 0x10, 0x63, 0x6f, 0x6e,\n\t0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x73,\n\t0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2,\n\t0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x04, 0x6e,\n\t0x65, 0x78, 0x74, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12,\n\t0x1a, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e,\n\t0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x22, 0x12, 0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72,\n\t0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x12, 0x17, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0f, 0xd2, 0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x4b,\n\t0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: frontend.auth.RegisterReq\n\t(*LoginReq)(nil),     // 1: frontend.auth.LoginReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t1, // 1: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/hertz_gen/frontend/cart/cart_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: cart_page.proto\n\npackage cart\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AddCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId  uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\" form:\"productId\"`\n\tProductNum int32  `protobuf:\"varint,2,opt,name=product_num,json=productNum,proto3\" json:\"product_num,omitempty\" form:\"productNum\"`\n}\n\nfunc (x *AddCartReq) Reset() {\n\t*x = AddCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddCartReq) ProtoMessage() {}\n\nfunc (x *AddCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddCartReq.ProtoReflect.Descriptor instead.\nfunc (*AddCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AddCartReq) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *AddCartReq) GetProductNum() int32 {\n\tif x != nil {\n\t\treturn x.ProductNum\n\t}\n\treturn 0\n}\n\nvar File_cart_page_proto protoreflect.FileDescriptor\n\nvar file_cart_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x6b, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71,\n\t0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x42, 0x0d, 0xe2, 0xbb, 0x18, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x49, 0x64, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x2f,\n\t0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x05, 0x42, 0x0e, 0xe2, 0xbb, 0x18, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x4e, 0x75, 0x6d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x32,\n\t0xa0, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x4b, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x19,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x09, 0xd2, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,\n\t0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x09, 0xca, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61,\n\t0x72, 0x74, 0x42, 0x4b, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64,\n\t0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_page_proto_rawDescOnce sync.Once\n\tfile_cart_page_proto_rawDescData = file_cart_page_proto_rawDesc\n)\n\nfunc file_cart_page_proto_rawDescGZIP() []byte {\n\tfile_cart_page_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_page_proto_rawDescData)\n\t})\n\treturn file_cart_page_proto_rawDescData\n}\n\nvar file_cart_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_cart_page_proto_goTypes = []interface{}{\n\t(*AddCartReq)(nil),   // 0: frontend.cart.AddCartReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_cart_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.cart.CartService.AddCartItem:input_type -> frontend.cart.AddCartReq\n\t1, // 1: frontend.cart.CartService.GetCart:input_type -> frontend.common.Empty\n\t1, // 2: frontend.cart.CartService.AddCartItem:output_type -> frontend.common.Empty\n\t1, // 3: frontend.cart.CartService.GetCart:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_page_proto_init() }\nfunc file_cart_page_proto_init() {\n\tif File_cart_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_page_proto_goTypes,\n\t\tDependencyIndexes: file_cart_page_proto_depIdxs,\n\t\tMessageInfos:      file_cart_page_proto_msgTypes,\n\t}.Build()\n\tFile_cart_page_proto = out.File\n\tfile_cart_page_proto_rawDesc = nil\n\tfile_cart_page_proto_goTypes = nil\n\tfile_cart_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/hertz_gen/frontend/category/category_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: category_page.proto\n\npackage category\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CategoryReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory string `protobuf:\"bytes,1,opt,name=category,proto3\" json:\"category,omitempty\" path:\"category\"`\n}\n\nfunc (x *CategoryReq) Reset() {\n\t*x = CategoryReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_category_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryReq) ProtoMessage() {}\n\nfunc (x *CategoryReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_category_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryReq.ProtoReflect.Descriptor instead.\nfunc (*CategoryReq) Descriptor() ([]byte, []int) {\n\treturn file_category_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CategoryReq) GetCategory() string {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn \"\"\n}\n\nvar File_category_page_proto protoreflect.FileDescriptor\n\nvar file_category_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x08, 0x63, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xd2, 0xbb, 0x18,\n\t0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x32, 0x6e, 0x0a, 0x0f, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13,\n\t0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2f, 0x3a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x42, 0x4f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d,\n\t0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_category_page_proto_rawDescOnce sync.Once\n\tfile_category_page_proto_rawDescData = file_category_page_proto_rawDesc\n)\n\nfunc file_category_page_proto_rawDescGZIP() []byte {\n\tfile_category_page_proto_rawDescOnce.Do(func() {\n\t\tfile_category_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_category_page_proto_rawDescData)\n\t})\n\treturn file_category_page_proto_rawDescData\n}\n\nvar file_category_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_category_page_proto_goTypes = []interface{}{\n\t(*CategoryReq)(nil),  // 0: frontend.category.CategoryReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_category_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.category.CategoryService.Category:input_type -> frontend.category.CategoryReq\n\t1, // 1: frontend.category.CategoryService.Category:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_category_page_proto_init() }\nfunc file_category_page_proto_init() {\n\tif File_category_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_category_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_category_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_category_page_proto_goTypes,\n\t\tDependencyIndexes: file_category_page_proto_depIdxs,\n\t\tMessageInfos:      file_category_page_proto_msgTypes,\n\t}.Build()\n\tFile_category_page_proto = out.File\n\tfile_category_page_proto_rawDesc = nil\n\tfile_category_page_proto_goTypes = nil\n\tfile_category_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/hertz_gen/frontend/checkout/checkout_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: checkout_page.proto\n\npackage checkout\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tFirstname       string `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\" form:\"firstname\"`\n\tLastname        string `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\" form:\"lastname\"`\n\tStreet          string `protobuf:\"bytes,4,opt,name=street,proto3\" json:\"street,omitempty\" form:\"street\"`\n\tZipcode         string `protobuf:\"bytes,5,opt,name=zipcode,proto3\" json:\"zipcode,omitempty\" form:\"zipcode\"`\n\tProvince        string `protobuf:\"bytes,6,opt,name=province,proto3\" json:\"province,omitempty\" form:\"province\"`\n\tCountry         string `protobuf:\"bytes,7,opt,name=country,proto3\" json:\"country,omitempty\" form:\"country\"`\n\tCity            string `protobuf:\"bytes,8,opt,name=city,proto3\" json:\"city,omitempty\" form:\"city\"`\n\tCardNum         string `protobuf:\"bytes,9,opt,name=card_num,json=cardNum,proto3\" json:\"card_num,omitempty\" form:\"cardNum\"`\n\tExpirationMonth int32  `protobuf:\"varint,10,opt,name=expiration_month,json=expirationMonth,proto3\" json:\"expiration_month,omitempty\" form:\"expirationMonth\"`\n\tExpirationYear  int32  `protobuf:\"varint,11,opt,name=expiration_year,json=expirationYear,proto3\" json:\"expiration_year,omitempty\" form:\"expirationYear\"`\n\tCvv             int32  `protobuf:\"varint,12,opt,name=cvv,proto3\" json:\"cvv,omitempty\" form:\"cvv\"`\n\tPayment         string `protobuf:\"bytes,13,opt,name=payment,proto3\" json:\"payment,omitempty\" form:\"payment\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetStreet() string {\n\tif x != nil {\n\t\treturn x.Street\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetZipcode() string {\n\tif x != nil {\n\t\treturn x.Zipcode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCardNum() string {\n\tif x != nil {\n\t\treturn x.CardNum\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationMonth\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetCvv() int32 {\n\tif x != nil {\n\t\treturn x.Cvv\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetPayment() string {\n\tif x != nil {\n\t\treturn x.Payment\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_page_proto protoreflect.FileDescriptor\n\nvar file_checkout_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa6, 0x04, 0x0a, 0x0b, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d,\n\t0xe2, 0xbb, 0x18, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x0a, 0xe2, 0xbb, 0x18, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x52, 0x06,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x7a, 0x69, 0x70,\n\t0x63, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a,\n\t0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70,\n\t0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x63, 0x6f,\n\t0x75, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c,\n\t0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xe2, 0xbb,\n\t0x18, 0x04, 0x63, 0x69, 0x74, 0x79, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x08,\n\t0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b,\n\t0xe2, 0xbb, 0x18, 0x07, 0x63, 0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x52, 0x07, 0x63, 0x61, 0x72,\n\t0x64, 0x4e, 0x75, 0x6d, 0x12, 0x3e, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13,\n\t0xe2, 0xbb, 0x18, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f,\n\t0x6e, 0x74, 0x68, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x6f, 0x6e, 0x74, 0x68, 0x12, 0x3b, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, 0xe2,\n\t0xbb, 0x18, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x12, 0x19, 0x0a, 0x03, 0x63, 0x76, 0x76, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xe2, 0xbb, 0x18, 0x03, 0x63, 0x76, 0x76, 0x52, 0x03, 0x63, 0x76, 0x76, 0x12, 0x25, 0x0a, 0x07,\n\t0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2,\n\t0xbb, 0x18, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x32, 0x96, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x6f, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0d, 0xca, 0xc1, 0x18,\n\t0x09, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x58, 0x0a, 0x0f, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,\n\t0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0xd2,\n\t0xc1, 0x18, 0x11, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x77, 0x61, 0x69,\n\t0x74, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0xca, 0xc1, 0x18, 0x10, 0x2f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x4f, 0x5a, 0x4d,\n\t0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64,\n\t0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f,\n\t0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_page_proto_rawDescOnce sync.Once\n\tfile_checkout_page_proto_rawDescData = file_checkout_page_proto_rawDesc\n)\n\nfunc file_checkout_page_proto_rawDescGZIP() []byte {\n\tfile_checkout_page_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_page_proto_rawDescData)\n\t})\n\treturn file_checkout_page_proto_rawDescData\n}\n\nvar file_checkout_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_checkout_page_proto_goTypes = []interface{}{\n\t(*CheckoutReq)(nil),  // 0: frontend.checkout.CheckoutReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_checkout_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.checkout.CheckoutService.Checkout:input_type -> frontend.checkout.CheckoutReq\n\t1, // 1: frontend.checkout.CheckoutService.CheckoutWaiting:input_type -> frontend.common.Empty\n\t1, // 2: frontend.checkout.CheckoutService.CheckoutResult:input_type -> frontend.common.Empty\n\t1, // 3: frontend.checkout.CheckoutService.Checkout:output_type -> frontend.common.Empty\n\t1, // 4: frontend.checkout.CheckoutService.CheckoutWaiting:output_type -> frontend.common.Empty\n\t1, // 5: frontend.checkout.CheckoutService.CheckoutResult:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_page_proto_init() }\nfunc file_checkout_page_proto_init() {\n\tif File_checkout_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_page_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_page_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_page_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_page_proto = out.File\n\tfile_checkout_page_proto_rawDesc = nil\n\tfile_checkout_page_proto_goTypes = nil\n\tfile_checkout_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x09, 0x61,\n\t0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,\n\t0x4c, 0x0a, 0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d,\n\t0x0a, 0x04, 0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a,\n\t0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.common.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.common.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/hertz_gen/frontend/order/order_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: order_page.proto\n\npackage order\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_order_page_proto protoreflect.FileDescriptor\n\nvar file_order_page_proto_rawDesc = []byte{\n\t0x0a, 0x10, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x32, 0x57, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x73,\n\t0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0a, 0xca, 0xc1, 0x18, 0x06, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x4c, 0x5a,\n\t0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar file_order_page_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_order_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.order.OrderService.OrderList:input_type -> frontend.common.Empty\n\t0, // 1: frontend.order.OrderService.OrderList:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_order_page_proto_init() }\nfunc file_order_page_proto_init() {\n\tif File_order_page_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_page_proto_goTypes,\n\t\tDependencyIndexes: file_order_page_proto_depIdxs,\n\t}.Build()\n\tFile_order_page_proto = out.File\n\tfile_order_page_proto_rawDesc = nil\n\tfile_order_page_proto_goTypes = nil\n\tfile_order_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/hertz_gen/frontend/product/product_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: product_page.proto\n\npackage product\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\" query:\"id\"`\n}\n\nfunc (x *ProductReq) Reset() {\n\t*x = ProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProductReq) ProtoMessage() {}\n\nfunc (x *ProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProductReq.ProtoReflect.Descriptor instead.\nfunc (*ProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nvar File_product_page_proto protoreflect.FileDescriptor\n\nvar file_product_page_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61,\n\t0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x42, 0x06, 0xb2, 0xbb, 0x18, 0x02, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x32, 0x62,\n\t0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x50, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x22, 0x0c, 0xca, 0xc1, 0x18, 0x08, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64,\n\t0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_page_proto_rawDescOnce sync.Once\n\tfile_product_page_proto_rawDescData = file_product_page_proto_rawDesc\n)\n\nfunc file_product_page_proto_rawDescGZIP() []byte {\n\tfile_product_page_proto_rawDescOnce.Do(func() {\n\t\tfile_product_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_page_proto_rawDescData)\n\t})\n\treturn file_product_page_proto_rawDescData\n}\n\nvar file_product_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_product_page_proto_goTypes = []interface{}{\n\t(*ProductReq)(nil),   // 0: frontend.product.ProductReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_product_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.product.ProductService.GetProduct:input_type -> frontend.product.ProductReq\n\t1, // 1: frontend.product.ProductService.GetProduct:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_product_page_proto_init() }\nfunc file_product_page_proto_init() {\n\tif File_product_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_page_proto_goTypes,\n\t\tDependencyIndexes: file_product_page_proto_depIdxs,\n\t\tMessageInfos:      file_product_page_proto_msgTypes,\n\t}.Build()\n\tFile_product_page_proto = out.File\n\tfile_product_page_proto_rawDesc = nil\n\tfile_product_page_proto_goTypes = nil\n\tfile_product_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/circuitbreak\"\n\t\"github.com/cloudwego/kitex/pkg/fallback\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tUserClient     userservice.Client\n\tProductClient  productcatalogservice.Client\n\tCartClient     cartservice.Client\n\tCheckoutClient checkoutservice.Client\n\tOrderClient    orderservice.Client\n\n\tonce sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitUserClient()\n\t\tinitProductClient()\n\t\tinitCartClient()\n\t\tinitCheckoutClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initUserClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\n\tUserClient, err = userservice.NewClient(\"user\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\n\tcbs := circuitbreak.NewCBSuite(func(ri rpcinfo.RPCInfo) string {\n\t\treturn circuitbreak.RPCInfo2Key(ri)\n\t})\n\n\tcbs.UpdateServiceCBConfig(\"shop-frontend/product/GetProduct\", circuitbreak.CBConfig{Enable: true, ErrRate: 0.5, MinSample: 2})\n\n\topts = append(opts, client.WithCircuitBreaker(cbs), client.WithFallback(fallback.NewFallbackPolicy(fallback.UnwrapHelper(func(ctx context.Context, req, resp interface{}, err error) (fbResp interface{}, fbErr error) {\n\t\tmethodName := rpcinfo.GetRPCInfo(ctx).To().Method()\n\t\tif err == nil {\n\t\t\treturn resp, err\n\t\t}\n\t\tif methodName != \"ListProducts\" {\n\t\t\treturn resp, err\n\t\t}\n\t\treturn &product.ListProductsResp{\n\t\t\tProducts: []*product.Product{\n\t\t\t\t{\n\t\t\t\t\tPrice:       6.6,\n\t\t\t\t\tId:          3,\n\t\t\t\t\tPicture:     \"/static/image/t-shirt.jpeg\",\n\t\t\t\t\tName:        \"T-Shirt\",\n\t\t\t\t\tDescription: \"CloudWeGo T-Shirt\",\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil\n\t}))))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t)\n\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCheckoutClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t)\n\tCheckoutClient, err = checkoutservice.NewClient(\"checkout\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t)\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzotelprovider \"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\trpc.InitClient()\n\n\taddress := conf.GetConf().Hertz.Address\n\n\tp := hertzotelprovider.NewOpenTelemetryProvider(\n\t\thertzotelprovider.WithEnableMetrics(false),\n\t)\n\tdefer p.Shutdown(context.Background())\n\n\th := server.New(server.WithHostPorts(address))\n\th.LoadHTMLGlob(\"template/*\")\n\th.Delims(\"{{\", \"}}\")\n\tregisterMiddleware(h)\n\n\trouter.GeneratedRegister(h)\n\n\th.GET(\"sign-in\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-in\", utils.H{\n\t\t\t\"title\": \"Sign in\",\n\t\t\t\"next\":  c.Query(\"next\"),\n\t\t})\n\t})\n\th.GET(\"sign-up\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", utils.H{\n\t\t\t\"title\": \"Sign up\",\n\t\t})\n\t})\n\n\th.Static(\"/static\", \"./\")\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\tstore, err := redis.NewStore(100, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tstore.Options(sessions.Options{MaxAge: 86400, Path: \"/\"})\n\trs, err := redis.GetRedisStore(store)\n\tif err == nil {\n\t\trs.SetSerializer(sessions.JSONSerializer{})\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\t// cores\n\th.Use(cors.Default())\n\tmiddleware.RegisterMiddleware(h)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tbyteRef := c.GetHeader(\"Referer\")\n\t\t\tref := string(byteRef)\n\t\t\tnext := \"/sign-in\"\n\t\t\tif ref != \"\" {\n\t\t\t\tif utils.ValidateNext(ref) {\n\t\t\t\t\tnext = fmt.Sprintf(\"%s?next=%s\", next, ref)\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.Redirect(302, []byte(next))\n\t\t\tc.Abort()\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc RegisterMiddleware(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/cart-num.tmpl",
    "content": "{{define \"cart-num\"}}\n    <a href=\"/cart\" class=\"btn position-relative\">\n        <i class=\"fa-solid fa-cart-shopping\" style=\"font-size: 2rem\">\n        </i>\n        {{ if $.cart_num}}\n        <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\">\n    {{ $.cart_num }}\n            {{ end }}\n  </span>\n    </a>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/cart.tmpl",
    "content": "{{ define \"cart\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <ul class=\"list-group\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n        {{ if $.items }}\n            <div class=\"mt-3 mb-5\">\n                <div class=\"float-end\">\n                    <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                    <a href=\"/checkout\" class=\"btn btn-lg btn-success float-end\">Check out</a>\n                </div>\n            </div>\n        {{else}}\n            <h1 class=\"text-center text-danger\">Your Cart is empty</h1>\n            <div class=\"text-center\"><a href=\"/\">Shop Hot Sale</a></div>\n        {{ end }}\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/category.tmpl",
    "content": "{{ define \"category\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/checkout.tmpl",
    "content": "{{ define \"checkout\" }}\n    {{ template \"header\" . }}\n    <div class=\"row mb-5\">\n        <div class=\"col-lg-8 col-sm-12\">\n            <form method=\"post\" action=\"/checkout/waiting\">\n                <h4 class=\"mb-3 mt-3\">Contact</h4>\n                <label for=\"email\" class=\"form-label col-12\">\n                    <input class=\"form-control\" id=\"email\" type=\"email\" placeholder=\"Email\" name=\"email\"\n                           aria-label=\"email\" value=\"abc@example.com\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">Delivery</h4>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"firstname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"firstname\" class=\"form-control\" placeholder=\"First name\"\n                               name=\"firstname\" value=\"world\">\n                    </label>\n                    <label for=\"lastname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"lastname\" class=\"form-control\" placeholder=\"Last name\" name=\"lastname\"\n                               value=\"hello\">\n                    </label>\n                </div>\n                <label for=\"street\" class=\"mb-3 mt-3 col-12 form-label\">\n                    <input type=\"text\" class=\"form-control\" placeholder=\"Street\" name=\"street\" value=\"7th street\"\n                           id=\"street\">\n                </label>\n                <label for=\"zipcode\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"zipcode\" name=\"zipcode\" placeholder=\"zipcode\"\n                           value=\"310000\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"city\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"city\" class=\"form-control\" placeholder=\"City\" name=\"city\"\n                               value=\"hangzhou\">\n                    </label>\n                    <label for=\"province\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"province\" class=\"form-control\" name=\"province\" placeholder=\"Province\"\n                               value=\"zhejiang\">\n                    </label>\n                </div>\n                <label for=\"country\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"country\" name=\"country\" placeholder=\"Country\"\n                           value=\"china\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">\n                    Payment\n                </h4>\n                <label for=\"card-num\" class=\"form-label col-12\">\n                    <input type=\"text\" id=\"card-num\" class=\"form-control\" name=\"cardNum\" placeholder=\"Card number\"\n                           value=\"424242424242424242\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"expiration-month\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-month\" name=\"expirationMonth\" class=\"form-control\"\n                               placeholder=\"Expiration Month\" value=\"12\">\n                    </label>\n                    <label for=\"expiration-year\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-year\" name=\"expirationYear\" class=\"form-control\"\n                               placeholder=\"Expiration Year\" value=\"2030\">\n                    </label>\n                    <label for=\"cvv\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"cvv\" class=\"form-control\" name=\"cvv\" placeholder=\"cvv\" required>\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"card\" value=\"card\" checked>\n                    <label class=\"form-check-label\" for=\"card\">\n                        Card\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"stripe\" value=\"stripe\" disabled>\n                    <label class=\"form-check-label\" for=\"stripe\">\n                        Stripe\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"paypal\" value=\"paypal\" disabled>\n                    <label class=\"form-check-label\" for=\"paypal\">\n                        Paypal\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"wechat\" value=\"wechat\" disabled>\n                    <label class=\"form-check-label\" for=\"wechat\">\n                        Wechat\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"alipay\" value=\"alipay\" disabled>\n                    <label class=\"form-check-label\" for=\"alipay\">\n                        Alipay\n                    </label>\n                </div>\n                <div class=\"mt-3 mb-3\">\n                    <div class=\"float-end\">\n                        <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                        <input type=\"submit\" class=\"btn btn-success\" value=\"Pay\">\n                    </div>\n                </div>\n            </form>\n        </div>\n        <ul class=\"list-group col-lg-4 col-sm-12\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/footer.tmpl",
    "content": "{{ define \"footer\" }}\n\n    </div>\n    </main>\n    <footer class=\"py-5 bg-primary text-white\">\n        <div class=\"footer-top\">\n            <div class=\"container footer-social\">\n                <p>© 2023 CloudWeGo (<a class=\"text-white\"\n                                        href=\"https://github.com/cloudwego\">Source Code</a>)</p>\n            </div>\n        </div>\n    </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/js/all.min.js\"\n            integrity=\"sha512-GWzVrcGlo0TxTRvz9ttioyYJ+Wwk9Ck0G81D+eO63BaqHaJ3YZX9wuqjwgfcV/MrB2PhaVX9DkYVhbFpStnqpQ==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    </body>\n    </html>\n{{ end }}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/header.tmpl",
    "content": "{{ define \"header\" }}\n    <!DOCTYPE html>\n    <html lang=\"en\">\n\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, shrink-to-fit=no\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n        {{ if $.redirect }}\n            <meta http-equiv=\"refresh\" content=\"5;url=/checkout/result\"/>\n        {{ end}}\n        <title>\n            CloudWeGo Shop\n        </title>\n        <link rel=\"stylesheet\" href=\"/static/css/bootstrap.min.css\">\n        <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n              integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n              crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n    </head>\n\n    <body class=\"min-vh-100\">\n    <header>\n        <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n            <div class=\"container\">\n                <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\"\n                        data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"/\">\n                    <img src=\"/static/image/logo.jpg\" style=\"height: 50px\" alt=\"\"> CloudWego Shop\n                </a>\n                <div class=\" ms-lg-3 d-block d-lg-none d-xl-none\">\n                    {{ template \"cart-num\" . }}\n                </div>\n                <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                    <ul class=\"navbar-nav mb-2 mb-lg-0 w-100\">\n                        <li class=\"nav-item dropdown\">\n                            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\"\n                               aria-expanded=\"false\">\n                                Categories\n                            </a>\n                            <ul class=\"dropdown-menu\">\n                                <li><a class=\"dropdown-item\" href=\"/category/t-shirt\">T-shirt</a></li>\n                                <li><a class=\"dropdown-item\" href=\"/category/sticker\">Sticker</a></li>\n                            </ul>\n                        </li>\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link\" href=\"/about\">About</a>\n                        </li>\n                        <form class=\"d-flex ms-auto\" role=\"search\" action=\"/search\" method=\"get\">\n                            <input class=\"form-control me-2\" type=\"search\" name=\"q\" placeholder=\"Search\"\n                                   aria-label=\"Search\" value=\"{{ .q }}\">\n                            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n                        </form>\n                        {{ if .user_id }}\n                            <div class=\"nav-item dropdown ms-3\">\n                                <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\"\n                                   aria-expanded=\"false\"><i class=\"fa-solid fa-user me-2\"></i>Hello</a>\n                                <ul class=\"dropdown-menu\">\n                                    <li><a class=\"dropdown-item\" href=\"/order\">Order Center</a></li>\n                                    <li>\n                                        <hr class=\"dropdown-divider\">\n                                    </li>\n                                    <li>\n                                        <form class=\"d-flex ms-auto\" action=\"/auth/logout\" method=\"post\">\n                                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                                        </form>\n                                    </li>\n                                </ul>\n                            </div>\n                        {{ else }}\n                            <div class=\"btn-group ms-3\" role=\"group\" aria-label=\"Basic mixed styles example\">\n                                <a href=\"/sign-in\" class=\"btn btn-primary\">Sign in</a>\n                            </div>\n                        {{ end }}\n                    </ul>\n                </div>\n                <div class=\"ms-lg-3 d-none d-lg-block d-xl-block\">\n                    {{ template \"cart-num\" . }}\n                </div>\n\n            </div>\n        </nav>\n        <div class=\"bg-primary text-center text-white pt-1 pb-1\">This website is hosted for demo purposes only. It is\n            not an\n            actual shop.\n        </div>\n        {{ if .error }}\n            <div class=\"alert alert-danger text-center\" role=\"alert\">{{ .error }}</div>\n         {{ end }}\n        {{ if .warning }}\n            <div class=\"alert alert-warning text-center\" role=\"alert\">{{ .warning }}</div>\n        {{ end }}\n    </header>\n    <main role=\"main\" class=\"home pt-5\" style=\"min-height:calc(100vh - 212px);\">\n        <div class=\"container\">\n            <h1 class=\"text-center\">{{ $.title }}</h1>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/home.tmpl",
    "content": "{{ define \"home\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items }}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/order.tmpl",
    "content": "{{ define \"order\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n                    <div class=\"card-body row\">\n                        {{ range $.orders }}\n                        <div class=\"card\">\n                            <div class=\"card-body\">\n                              <h6 class=\"card-subtitle mb-2 text-muted\">{{.CreatedDate}} Order ID: {{.OrderId}}</h6>\n                              <ul class=\"list-group col-lg-12 col-sm-15\">\n                                {{ range .Items }}\n                                    <li class=\"list-group-item border-0\">\n                                        <div class=\"card border-0\">\n                                            <div class=\"card-body row\">\n                                                <div class=\"col-3\">\n                                                    <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                                                </div>\n                                                <div class=\"col-3\">\n                                                    <div class=\"mt-1\">{{ .ProductName }}</div>\n                                                </div>\n                                                <div class=\"col-2\">\n                                                    <div class=\"mt-1\">x {{ .Qty }}</div>\n                                                </div>\n                                                <div class=\"col-4\">\n                                                    <div class=\"mt-1\">Cost: {{ .Cost }}</div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </li>\n                                {{ end}}\n                            </ul>\n                            </div>\n                        </div>\n                        <p>\n                        {{ end}}\n                    </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/product.tmpl",
    "content": "{{ define \"product\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div id=\"productPicture\" class=\"carousel slide col-lg-6 col-sm-12\">\n                    <div class=\"carousel-indicators\">\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"0\"\n                                class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"1\"\n                                aria-label=\"Slide 2\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"2\"\n                                aria-label=\"Slide 3\"></button>\n                    </div>\n                    <div class=\"carousel-inner\">\n                        <div class=\"carousel-item active\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                    </div>\n                    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"prev\">\n                        <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Previous</span>\n                    </button>\n                    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"next\">\n                        <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Next</span>\n                    </button>\n                </div>\n                <div class=\"col-lg-1\"></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-center\">\n                    <form action=\"/cart\" method=\"post\">\n                        <h5 class=\"card-title\">{{ .item.Name }}</h5>\n                        <p class=\"card-text\">{{ .item.Description }}</p>\n                        <p class=\"card-text\">${{ .item.Price }}</p>\n                        <input type=\"hidden\" value=\"{{ .item.Id }}\" name=\"productId\">\n                        <label for=\"productNum\">数量：</label>\n                        <input type=\"number\" class=\"form-control mt-3\" id=\"productNum\" name=\"productNum\" value=\"1\"\n                               min=\"1\"/>\n                        <input type=\"submit\" class=\"btn btn-primary mt-3\" value=\"Add to Cart\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/result.tmpl",
    "content": "{{ define \"result\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <i class=\"fa-regular fa-circle-check fs-1 text-success\"></i>\n        <div class=\"text-center fs-3\">\n            Congratulations, you have successfully placed an order.\n        </div>\n    </div>\n    <div class=\"d-flex justify-content-center\">\n        <a href=\"/order\" class=\"btn btn-info\">Check Order</a>\n        <a href=\"/\" class=\"btn btn-success ms-5\">Back to Home</a>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/search.tmpl",
    "content": "{{ define \"search\" }}\n    {{ template \"header\" . }}\n    {{ if .q }}\n        <div class=\"d-inline-block border border-success rounded-4 p-1 ps-4 pe-4\">\n            <div>\n                {{ .q }}\n                <a href=\"/category\" class=\"ps-4\">\n                    <button type=\"button\" class=\"btn btn-sm btn-danger\" aria-label=\"Close\">X</button>\n                </a>\n            </div>\n        </div>\n    {{ end}}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/sign-in.tmpl",
    "content": "{{ define \"sign-in\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/login{{ if .next }}?next={{.next}} {{ end}}\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" required>\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\" required>\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign up</a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign in</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/sign-up.tmpl",
    "content": "{{ define \"sign-up\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" aria-describedby=\"emailHelp\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password-confirm\" class=\"form-label\">Password confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password-confirm\" name=\"password-confirm\">\n            </div>\n            <div class=\"mb-3\">\n                Already have account, click here to <a href=\"/sign-in\">Sign in</a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign up</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/utils.tmpl",
    "content": "{{ define \"required\" }}\n    <span class=\"text-danger\">*</span>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/template/waiting.tmpl",
    "content": "{{ define \"waiting\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <div class=\"text-danger h3 text-center mb-5\">\n            Wait a minutes, please don't close the window\n        </div>\n        <div class=\"spinner-grow text-primary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-secondary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-success\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-danger\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-warning\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-info\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-light\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-dark\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/types/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage types\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype Order struct {\n\tConsignee   Consignee\n\tOrderId     string\n\tCreatedDate string\n\tOrderState  string\n\tCost        float32\n\tItems       []OrderItem\n}\n\ntype OrderItem struct {\n\tProductId   uint32\n\tProductName string\n\tPicture     string\n\tQty         uint32\n\tCost        float32\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"frontend\"\n\ntype SessionUserIdKey string\n\nconst UserIdKey = SessionUserIdKey(\"user_id\")\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) uint32 {\n\tif ctx.Value(UserIdKey) == nil {\n\t\treturn 0\n\t}\n\treturn uint32(ctx.Value(UserIdKey).(float64))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/utils/response.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/utils/safe.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"net/url\"\n\nvar validHost = []string{\n\t\"localhost:8080\",\n}\n\nfunc ValidateNext(next string) bool {\n\turlObj, err := url.Parse(next)\n\tif err != nil {\n\t\treturn false\n\t}\n\tif InArray(urlObj.Host, validHost) {\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/frontend/utils/strings.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nfunc InArray[T int | int32 | int64 | float32 | float64 | string](needle T, haystack []T) bool {\n\tfor _, k := range haystack {\n\t\tif needle == k {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Order{},\n\t\t\t&model.OrderItem{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/model/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype Order struct {\n\tBase\n\tOrderId      string `gorm:\"uniqueIndex;size:256\"`\n\tUserId       uint32\n\tUserCurrency string\n\tConsignee    Consignee   `gorm:\"embedded\"`\n\tOrderItems   []OrderItem `gorm:\"foreignKey:OrderIdRefer;references:OrderId\"`\n}\n\nfunc (o Order) TableName() string {\n\treturn \"order\"\n}\n\nfunc ListOrder(db *gorm.DB, ctx context.Context, userId uint32) (orders []Order, err error) {\n\terr = db.Debug().Model(&Order{}).Where(&Order{UserId: userId}).Preload(\"OrderItems\").Find(&orders).Error\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/model/order_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\ntype OrderItem struct {\n\tBase\n\tProductId    uint32\n\tOrderIdRefer string `gorm:\"size:256;index\"`\n\tQuantity     int32\n\tCost         float32\n}\n\nfunc (oi OrderItem) TableName() string {\n\treturn \"order_item\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/service/list_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype ListOrderService struct {\n\tctx context.Context\n} // NewListOrderService new ListOrderService\nfunc NewListOrderService(ctx context.Context) *ListOrderService {\n\treturn &ListOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListOrderService) Run(req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\t// Finish your business logic.\n\torders, err := model.ListOrder(mysql.DB, s.ctx, req.UserId)\n\tif err != nil {\n\t\tklog.Errorf(\"model.ListOrder.err:%v\", err)\n\t\treturn nil, err\n\t}\n\tvar list []*order.Order\n\tfor _, v := range orders {\n\t\tvar items []*order.OrderItem\n\t\tfor _, v := range v.OrderItems {\n\t\t\titems = append(items, &order.OrderItem{\n\t\t\t\tCost: v.Cost,\n\t\t\t\tItem: &cart.CartItem{\n\t\t\t\t\tProductId: v.ProductId,\n\t\t\t\t\tQuantity:  v.Quantity,\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\to := &order.Order{\n\t\t\tOrderId:      v.OrderId,\n\t\t\tUserId:       v.UserId,\n\t\t\tUserCurrency: v.UserCurrency,\n\t\t\tEmail:        v.Consignee.Email,\n\t\t\tCreatedAt:    int32(v.CreatedAt.Unix()),\n\t\t\tAddress: &order.Address{\n\t\t\t\tCountry:       v.Consignee.Country,\n\t\t\t\tCity:          v.Consignee.City,\n\t\t\t\tStreetAddress: v.Consignee.StreetAddress,\n\t\t\t\tZipCode:       v.Consignee.ZipCode,\n\t\t\t},\n\t\t\tOrderItems: items,\n\t\t}\n\t\tlist = append(list, o)\n\t}\n\tresp = &order.ListOrderResp{\n\t\tOrders: list,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/service/list_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/service/place_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype PlaceOrderService struct {\n\tctx context.Context\n} // NewPlaceOrderService new PlaceOrderService\nfunc NewPlaceOrderService(ctx context.Context) *PlaceOrderService {\n\treturn &PlaceOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *PlaceOrderService) Run(req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\t// Finish your business logic.\n\tif len(req.OrderItems) == 0 {\n\t\terr = fmt.Errorf(\"OrderItems empty\")\n\t\treturn\n\t}\n\n\terr = mysql.DB.Transaction(func(tx *gorm.DB) error {\n\t\torderId, _ := uuid.NewUUID()\n\n\t\to := &model.Order{\n\t\t\tOrderId:      orderId.String(),\n\t\t\tUserId:       req.UserId,\n\t\t\tUserCurrency: req.UserCurrency,\n\t\t\tConsignee: model.Consignee{\n\t\t\t\tEmail: req.Email,\n\t\t\t},\n\t\t}\n\t\tif req.Address != nil {\n\t\t\ta := req.Address\n\t\t\to.Consignee.Country = a.Country\n\t\t\to.Consignee.State = a.State\n\t\t\to.Consignee.City = a.City\n\t\t\to.Consignee.StreetAddress = a.StreetAddress\n\t\t}\n\t\tif err := tx.Create(o).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvar itemList []*model.OrderItem\n\t\tfor _, v := range req.OrderItems {\n\t\t\titemList = append(itemList, &model.OrderItem{\n\t\t\t\tOrderIdRefer: o.OrderId,\n\t\t\t\tProductId:    v.Item.ProductId,\n\t\t\t\tQuantity:     v.Item.Quantity,\n\t\t\t\tCost:         v.Cost,\n\t\t\t})\n\t\t}\n\t\tif err := tx.Create(&itemList).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp = &order.PlaceOrderResp{\n\t\t\tOrder: &order.OrderResult{\n\t\t\t\tOrderId: orderId.String(),\n\t\t\t},\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/biz/service/place_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestPlaceOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"order\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/order\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/google/uuid v1.5.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=\ngithub.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/service\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n)\n\n// OrderServiceImpl implements the last service interface defined in the IDL.\ntype OrderServiceImpl struct{}\n\n// PlaceOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) PlaceOrder(ctx context.Context, req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = service.NewPlaceOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// ListOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) ListOrder(ctx context.Context, req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\tresp, err = service.NewListOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'order'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := orderservice.NewServer(new(OrderServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/order/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/order\"\nexec \"$CURDIR/bin/order\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\ntmp\n\n.env\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.PaymentLog{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/biz/model/payment.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype PaymentLog struct {\n\tBase\n\tUserId        uint32    `json:\"user_id\"`\n\tOrderId       string    `json:\"order_id\"`\n\tTransactionId string    `json:\"transaction_id\"`\n\tAmount        float32   `json:\"amount\"`\n\tPayAt         time.Time `json:\"pay_at\"`\n}\n\nfunc (p PaymentLog) TableName() string {\n\treturn \"payment\"\n}\n\nfunc CreatePaymentLog(db *gorm.DB, ctx context.Context, payment *PaymentLog) error {\n\treturn db.WithContext(ctx).Model(&PaymentLog{}).Create(payment).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/biz/service/charge.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\tcreditcard \"github.com/durango/go-credit-card\"\n\t\"github.com/google/uuid\"\n)\n\ntype ChargeService struct {\n\tctx context.Context\n} // NewChargeService new ChargeService\nfunc NewChargeService(ctx context.Context) *ChargeService {\n\treturn &ChargeService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ChargeService) Run(req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tcard := creditcard.Card{\n\t\tNumber: req.CreditCard.CreditCardNumber,\n\t\tCvv:    strconv.Itoa(int(req.CreditCard.CreditCardCvv)),\n\t\tMonth:  strconv.Itoa(int(req.CreditCard.CreditCardExpirationMonth)),\n\t\tYear:   strconv.Itoa(int(req.CreditCard.CreditCardExpirationYear)),\n\t}\n\n\terr = card.Validate(true)\n\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(400, err.Error())\n\t}\n\n\ttranslationId, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = model.CreatePaymentLog(mysql.DB, s.ctx, &model.PaymentLog{\n\t\tUserId:        req.UserId,\n\t\tOrderId:       req.OrderId,\n\t\tTransactionId: translationId.String(),\n\t\tAmount:        req.Amount,\n\t\tPayAt:         time.Now(),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &payment.ChargeResp{TransactionId: translationId.String()}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/biz/service/charge_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCharge_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"payment\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/payment\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082\n\tgithub.com/google/uuid v1.5.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082 h1:3RgcPZrUWhrxqhtDkuRmDTRVXGkxrVMZtJMic7cEtGA=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082/go.mod h1:jKPLGXGRR3v90kZOLs/kUMffoEot8IrRDGmmzI3kOtg=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=\ngithub.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/service\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n)\n\n// PaymentServiceImpl implements the last service interface defined in the IDL.\ntype PaymentServiceImpl struct{}\n\n// Charge implements the PaymentServiceImpl interface.\nfunc (s *PaymentServiceImpl) Charge(ctx context.Context, req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tresp, err = service.NewChargeService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'payment'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/middleware\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := paymentservice.NewServer(new(PaymentServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMiddleware(middleware.ServerMiddleware),\n\t)\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/middleware/mw.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/pkg/endpoint\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n)\n\nfunc ServerMiddleware(next endpoint.Endpoint) endpoint.Endpoint {\n\treturn func(ctx context.Context, req, resp interface{}) (err error) {\n\t\tri := rpcinfo.GetRPCInfo(ctx)\n\t\t// get client serviceName\n\t\tklog.Infof(\"client serviceName: %v\\n\", ri.From().ServiceName())\n\t\tif err := next(ctx, req, resp); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/payment.sql",
    "content": "create table payment\n(\n    id             int auto_increment,\n    user_id        int            not null,\n    order_id       varchar(100)   not null,\n    transaction_id varchar(100)   not null,\n    amount         decimal(10, 2) not null,\n    pay_at         datetime       not null,\n    created_at     datetime       not null default current_timestamp,\n    updated_at     datetime       not null default current_timestamp on update current_timestamp,\n    constraint payment_pk primary key (id)\n);"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/payment\"\nexec \"$CURDIR/bin/payment\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/payment/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n.env"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.Product{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Product{},\n\t\t\t&model.Category{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `product`.`category` VALUES (1,'2023-12-06 15:05:06','2023-12-06 15:05:06','T-Shirt','T-Shirt'),(2,'2023-12-06 15:05:06','2023-12-06 15:05:06','Sticker','Sticker')\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product` VALUES ( 1, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Notebook', 'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ', '/static/image/notebook.jpeg', 9.90 ), ( 2, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Mouse-Pad', 'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ', '/static/image/mouse-pad.jpeg', 8.80 ), ( 3, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt.jpeg', 6.60 ), ( 4, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-1.jpeg', 2.20 ), ( 5, '2023-12-06 15:26:19', '2023-12-09 22:32:35', 'Sweatshirt', 'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.', '/static/image/sweatshirt.jpeg', 1.10 ), ( 6, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-2.jpeg', 1.80 ), ( 7, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'mascot', 'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.', '/static/image/logo.jpg', 4.80 )\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product_category` (product_id,category_id) VALUES ( 1, 2 ), ( 2, 2 ), ( 3, 1 ), ( 4, 1 ), ( 5, 1 ), ( 6, 1 ),( 7, 2 )\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/redis/go-redis/extra/redisotel/v9\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n\tredisotel.InstrumentTracing(RedisClient) //nolint:errcheck\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/model/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Category struct {\n\tBase\n\tName        string    `json:\"name\"`\n\tDescription string    `json:\"description\"`\n\tProducts    []Product `json:\"product\" gorm:\"many2many:product_category\"`\n}\n\nfunc (c Category) TableName() string {\n\treturn \"category\"\n}\n\nfunc GetProductsByCategoryName(db *gorm.DB, ctx context.Context, name string) (category []Category, err error) {\n\terr = db.WithContext(ctx).Model(&Category{}).Where(&Category{Name: name}).Preload(\"Products\").Find(&category).Error\n\treturn category, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/model/product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tBase\n\tName        string     `json:\"name\"`\n\tDescription string     `json:\"description\"`\n\tPicture     string     `json:\"picture\"`\n\tPrice       float32    `json:\"price\"`\n\tCategories  []Category `json:\"categories\" gorm:\"many2many:product_category\"`\n}\n\nfunc (p Product) TableName() string {\n\treturn \"product\"\n}\n\ntype ProductQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (p ProductQuery) GetById(productId int) (product Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn\n}\n\nfunc NewProductQuery(ctx context.Context, db *gorm.DB) ProductQuery {\n\treturn ProductQuery{ctx: ctx, db: db}\n}\n\ntype CachedProductQuery struct {\n\tproductQuery ProductQuery\n\tcacheClient  *redis.Client\n\tprefix       string\n}\n\nfunc (c CachedProductQuery) GetById(productId int) (product Product, err error) {\n\tcacheKey := fmt.Sprintf(\"%s_%s_%d\", c.prefix, \"product_by_id\", productId)\n\tcachedResult := c.cacheClient.Get(c.productQuery.ctx, cacheKey)\n\n\terr = func() error {\n\t\terr1 := cachedResult.Err()\n\t\tif err1 != nil {\n\t\t\treturn err1\n\t\t}\n\t\tcachedResultByte, err2 := cachedResult.Bytes()\n\t\tif err2 != nil {\n\t\t\treturn err2\n\t\t}\n\t\terr3 := json.Unmarshal(cachedResultByte, &product)\n\t\tif err3 != nil {\n\t\t\treturn err3\n\t\t}\n\t\treturn nil\n\t}()\n\n\tif err != nil {\n\t\tproduct, err = c.productQuery.GetById(productId)\n\t\tif err != nil {\n\t\t\treturn Product{}, err\n\t\t}\n\t\tencoded, err := json.Marshal(product)\n\t\tif err != nil {\n\t\t\treturn product, nil\n\t\t}\n\t\t_ = c.cacheClient.Set(c.productQuery.ctx, cacheKey, encoded, time.Hour)\n\t}\n\treturn\n}\n\nfunc NewCachedProductQuery(pq ProductQuery, cacheClient *redis.Client) CachedProductQuery {\n\treturn CachedProductQuery{productQuery: pq, cacheClient: cacheClient, prefix: \"cloudwego_shop\"}\n}\n\nfunc GetProductById(db *gorm.DB, ctx context.Context, productId int) (product Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn product, err\n}\n\nfunc SearchProduct(db *gorm.DB, ctx context.Context, q string) (product []*Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Find(&product, \"name like ? or description like ?\", \"%\"+q+\"%\", \"%\"+q+\"%\").Error\n\treturn product, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetProductService struct {\n\tctx context.Context\n} // NewGetProductService new GetProductService\nfunc NewGetProductService(ctx context.Context) *GetProductService {\n\treturn &GetProductService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetProductService) Run(req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\t// Finish your business logic.\n\tif req.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40000, \"product id is required\")\n\t}\n\n\tp, err := model.NewCachedProductQuery(model.NewProductQuery(s.ctx, mysql.DB), redis.RedisClient).GetById(int(req.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &product.GetProductResp{\n\t\tProduct: &product.Product{\n\t\t\tId:          uint32(p.ID),\n\t\t\tPicture:     p.Picture,\n\t\t\tPrice:       p.Price,\n\t\t\tDescription: p.Description,\n\t\t\tName:        p.Name,\n\t\t},\n\t}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/service/get_product_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetProduct_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewGetProductService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.GetProductRequest{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/service/list_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype ListProductsService struct {\n\tctx context.Context\n} // NewListProductsService new ListProductsService\nfunc NewListProductsService(ctx context.Context) *ListProductsService {\n\treturn &ListProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListProductsService) Run(req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\t// Finish your business logic.\n\tc, err := model.GetProductsByCategoryName(mysql.DB, s.ctx, req.CategoryName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &product.ListProductsResp{}\n\tfor _, v1 := range c {\n\t\tfor _, v := range v1.Products {\n\t\t\tresp.Products = append(resp.Products, &product.Product{Id: uint32(v.ID), Name: v.Name, Description: v.Description, Picture: v.Picture, Price: v.Price})\n\t\t}\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/service/list_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewListProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.ListProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype SearchProductsService struct {\n\tctx context.Context\n} // NewSearchProductsService new SearchProductsService\nfunc NewSearchProductsService(ctx context.Context) *SearchProductsService {\n\treturn &SearchProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SearchProductsService) Run(req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\t// Finish your business logic.\n\tp, err := model.SearchProduct(mysql.DB, s.ctx, req.Query)\n\tvar results []*product.Product\n\tfor _, v := range p {\n\t\tresults = append(results, &product.Product{\n\t\t\tId:          uint32(v.ID),\n\t\t\tName:        v.Name,\n\t\t\tDescription: v.Description,\n\t\t\tPicture:     v.Picture,\n\t\t\tPrice:       v.Price,\n\t\t})\n\t}\n\treturn &product.SearchProductsResp{Results: results}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/biz/service/search_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestSearchProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewSearchProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.SearchProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"product\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n\t// Centralized Config Server\n\tConfigServer ConfigServer `yaml:\"configServer\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\ntype ConfigServer struct{}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/product\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/config-etcd v0.1.0\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/coreos/go-semver v0.3.0 // indirect\n\tgithub.com/coreos/go-systemd/v22 v22.3.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.etcd.io/etcd/api/v3 v3.5.10 // indirect\n\tgo.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect\n\tgo.etcd.io/etcd/client/v3 v3.5.10 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-etcd v0.1.0 h1:yDsIeQYEFYonjexoESsjFImdCFeU2emqZYe0a0AGCW0=\ngithub.com/kitex-contrib/config-etcd v0.1.0/go.mod h1:Brun1ZoAIJNzhO/cs4ZsJqSdKx0kYxheOnVpUQYO5HA=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ=\ngithub.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k=\ngo.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U=\ngo.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao=\ngo.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/service\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\n// ProductCatalogServiceImpl implements the last service interface defined in the IDL.\ntype ProductCatalogServiceImpl struct{}\n\n// ListProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) ListProducts(ctx context.Context, req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\tresp, err = service.NewListProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetProduct implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) GetProduct(ctx context.Context, req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tresp, err = service.NewGetProductService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// SearchProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) SearchProducts(ctx context.Context, req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\tresp, err = service.NewSearchProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'product'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"github.com/kitex-contrib/config-etcd/etcd\"\n\tetcdServer \"github.com/kitex-contrib/config-etcd/server\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := productcatalogservice.NewServer(new(ProductCatalogServiceImpl), opts...)\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\tetcdClient, err := etcd.NewClient(etcd.Options{})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts = append(opts,\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithSuite(etcdServer.NewSuite(serviceName, etcdClient)),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/product\"\nexec \"$CURDIR/bin/product\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/script/product.sql",
    "content": "CREATE TABLE `category`\n(\n    `id`          int          NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)  NOT NULL,\n    `description` varchar(255) NOT NULL,\n    `created_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `category`\nVALUES (1, 'Clothes', 'Clothes', '2023-12-06 15:05:06', '2023-12-06 15:05:06'),\n       (2, 'Other', 'Other', '2023-12-06 15:05:06', '2023-12-06 15:05:06');\nCREATE TABLE `product`\n(\n    `id`          int            NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)    NOT NULL,\n    `description` varchar(255)   NOT NULL,\n    `picture`     varchar(255)   NOT NULL,\n    `price`       decimal(10, 2) NOT NULL,\n    `created_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product`\nVALUES (1, 'Notebook',\n        'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ',\n        '/static/image/notebook.jpeg', 9.90, '2023-12-06 15:26:19', '2023-12-09 22:29:10'),\n       (2, 'Mouse-Pad',\n        'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ',\n        '/static/image/mouse-pad.jpeg', 8.80, '2023-12-06 15:26:19', '2023-12-09 22:29:59'),\n       (3, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt.jpeg', 6.60, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (4, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-1.jpeg', 2.20, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (5, 'Sweatshirt',\n        'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.',\n        '/static/image/sweatshirt.jpeg', 1.10, '2023-12-06 15:26:19', '2023-12-09 22:32:35'),\n       (6, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-2.jpeg', 1.80, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (10, 'mascot',\n        'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.',\n        '/static/image/logo.jpg', 4.80, '2023-12-06 15:26:19', '2023-12-09 22:39:47');\nCREATE TABLE `product_category`\n(\n    `id`          int      NOT NULL AUTO_INCREMENT,\n    `product_id`  int      NOT NULL,\n    `category_id` int      NOT NULL,\n    `created_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product_category`\nVALUES (1, 1, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (2, 2, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (3, 3, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (4, 4, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (5, 5, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (6, 6, 1, '2023-12-06 15:27:30', '2023-12-09 22:41:47'),\n       (10, 10, 2, '2023-12-06 15:27:30', '2023-12-06 15:27:30');"
  },
  {
    "path": "gomall/tutorial/ch14/app/product/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"shop-product\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.User{})\n\t\terr := DB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.User{},\n\t\t)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `user` (`id`,`created_at`,`updated_at`,`email`,`password_hashed`) VALUES (1,'2023-12-26 09:46:19.852','2023-12-26 09:46:19.852','123@admin.com','$2a$10$jTvUFh7Z8Kw0hLV8WrAws.PRQTeuH4gopJ7ZMoiFvwhhz5Vw.bj7C')\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"time\"\n)\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tBase\n\tEmail          string `gorm:\"unique\"`\n\tPasswordHashed string\n}\n\nfunc (u User) TableName() string {\n\treturn \"user\"\n}\n\nfunc GetByEmail(db *gorm.DB, ctx context.Context, email string) (user *User, err error) {\n\terr = db.WithContext(ctx).Model(&User{}).Where(&User{Email: email}).First(&user).Error\n\treturn\n}\n\nfunc Create(db *gorm.DB, ctx context.Context, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tklog.Infof(\"LoginReq:%+v\", req)\n\tuserRow, err := model.GetByEmail(mysql.DB, s.ctx, req.Email)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(userRow.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn\n\t}\n\treturn &user.LoginResp{UserId: int32(userRow.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewLoginService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.LoginReq{\n\t// \tEmail:    \"1111@qq.com\",\n\t// \tPassword: \"123\",\n\t// }\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Password != req.ConfirmPassword {\n\t\terr = errors.New(\"Password must be the same as ConfirmPassword\")\n\t\treturn\n\t}\n\thashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(hashedPassword),\n\t}\n\tif err = model.Create(mysql.DB, s.ctx, newUser); err != nil {\n\t\treturn\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewRegisterService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.RegisterReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t)\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\topts = append(opts, server.WithSuite(tracing.NewServerSuite()))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch14/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/tutorial/ch14/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"unique\"`\n\tPassword string `gorm:\"varchar(64),not null\"`\n}\n\nfunc (u User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\tmysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"a958af3702caf245d205da6164afebe0\"})\n\tvar u model.User\n\tmysql.DB.First(&u)\n\tfmt.Printf(\"%#v\", u)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch14/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch14/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: \"redis:latest\"\n    ports:\n      - 6379:6379\n  nats:\n    image: nats:latest\n    ports:\n      - \"4222:4222\"\n      - \"8222:8222\"\n"
  },
  {
    "path": "gomall/tutorial/ch14/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/cart\n\t./app/checkout\n\t./app/email\n\t./app/frontend\n\t./app/order\n\t./app/payment\n\t./app/product\n\t./app/user\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/henrylee2cn/ameda v1.4.10 // indirect\n\tgithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/hello_world/go.sum",
    "content": "github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch14/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n  optional string raw_body = 50101;\n  optional string query = 50102;\n  optional string header = 50103;\n  optional string cookie = 50104;\n  optional string body = 50105;\n  optional string path = 50106;\n  optional string vd = 50107;\n  optional string form = 50108;\n  optional string js_conv = 50109;\n  optional string file_name = 50110;\n  optional string none = 50111;\n\n  // 50131~50160 used to extend field option by hz\n  optional string form_compatible = 50131;\n  optional string js_conv_compatible = 50132;\n  optional string file_name_compatible = 50133;\n  optional string none_compatible = 50134;\n  // 50135 is reserved to vt_compatible\n  // optional FieldRules vt_compatible = 50135;\n\n  optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n  optional string get = 50201;\n  optional string post = 50202;\n  optional string put = 50203;\n  optional string delete = 50204;\n  optional string patch = 50205;\n  optional string options = 50206;\n  optional string head = 50207;\n  optional string any = 50208;\n  optional string gen_path =\n      50301; // The path specified by the user when the client code is\n             // generated, with a higher priority than api_version\n  optional string api_version =\n      50302; // Specify the value of the :version variable in path when the\n             // client code is generated\n  optional string tag = 50303;  // rpc tag, can be multiple, separated by commas\n  optional string name = 50304; // Name of rpc\n  optional string api_level = 50305;  // Interface Level\n  optional string serializer = 50306; // Serialization method\n  optional string param =\n      50307; // Whether client requests take public parameters\n  optional string baseurl = 50308; // Baseurl used in ttnet routing\n  optional string handler_path =\n      50309; // handler_path specifies the path to generate the method\n\n  // 50331~50360 used to extend method option by hz\n  optional string handler_path_compatible =\n      50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n  optional int32 http_code = 50401;\n\n  // 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n  optional string base_domain = 50402;\n\n  // 50731~50760 used to extend service option by hz\n  optional string base_domain_compatible = 50731;\n  optional string service_path = 50732;\n}\n\nextend google.protobuf.MessageOptions {\n  // optional FieldRules msg_vt = 50111;\n\n  optional string reserve = 50830;\n  // 550831 is reserved to msg_vt_compatible\n  // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/idl/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart;\n\noption go_package = '/cart';\n\nservice CartService {\n  rpc AddItem(AddItemReq) returns (AddItemResp) {}\n  rpc GetCart(GetCartReq) returns (GetCartResp) {}\n  rpc EmptyCart(EmptyCartReq) returns (EmptyCartResp) {}\n}\n\nmessage CartItem {\n  uint32 product_id = 1;\n  int32  quantity = 2;\n}\n\nmessage AddItemReq {\n  uint32 user_id = 1;\n  CartItem item = 2;\n}\n\nmessage AddItemResp {}\n\nmessage EmptyCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartResp {\n  Cart cart = 1;\n}\n\nmessage Cart {\n  uint32 user_id = 1;\n  repeated CartItem items = 2;\n}\n\nmessage EmptyCartResp {}\n"
  },
  {
    "path": "gomall/tutorial/ch14/idl/checkout.proto",
    "content": "syntax = \"proto3\";\n\npackage  checkout;\n\nimport \"payment.proto\";\n\noption go_package = \"/checkout\";\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (CheckoutResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  string zip_code = 5;\n}\n\nmessage CheckoutReq {\n  uint32 user_id = 1;\n  string firstname = 2;\n  string lastname = 3;\n  string email = 4;\n  Address address = 5;\n  payment.CreditCardInfo credit_card = 6;\n}\n\nmessage CheckoutResp {\n  string order_id = 1;\n  string transaction_id = 2;\n}"
  },
  {
    "path": "gomall/tutorial/ch14/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch14/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch14/idl/email.proto",
    "content": "syntax = \"proto3\";\n\npackage email;\n\noption go_package = \"/email\";\n\nmessage EmailReq{\n  string from = 1;\n  string to = 2;\n  string content_type = 3;\n  string subject = 4;\n  string content = 5;\n}\n\nmessage EmailResp {\n\n}\n\nservice EmailService{\n  rpc Send(EmailReq) returns (EmailResp);\n}"
  },
  {
    "path": "gomall/tutorial/ch14/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\noption go_package = \"/frontend/auth\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage RegisterReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string confirm_password = 3 [(api.form) = \"confirm_password\"];\n}\n\nmessage LoginReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string next = 3 [(api.query) = \"next\"];\n}\n\nservice AuthService {\n  rpc register(RegisterReq) returns (common.Empty) {\n    option (api.post) = \"/auth/register\";\n  }\n  rpc login(LoginReq) returns (common.Empty) {\n    option (api.post) = \"/auth/login\";\n  }\n  rpc logout(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/auth/logout\";\n  }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/idl/frontend/cart_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.cart;\n\noption go_package = \"/frontend/cart\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage AddCartReq {\n  uint32 product_id = 1 [(api.form) = \"productId\"];\n  int32 product_num = 2 [(api.form) = \"productNum\"];\n}\n\nservice CartService {\n  rpc AddCartItem(AddCartReq) returns (common.Empty) {\n    option (api.post) = \"/cart\";\n  }\n  rpc GetCart(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/cart\";\n  }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/idl/frontend/category_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.category;\n\noption go_package = \"/frontend/category\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CategoryReq { string category = 1 [(api.path)=\"category\"]; }\n\nservice CategoryService {\n  rpc Category(CategoryReq) returns (common.Empty) {\n    option (api.get) = \"/category/:category\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch14/idl/frontend/checkout_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.checkout;\n\noption go_package = \"/frontend/checkout\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CheckoutReq {\n  string email = 1 [(api.form) = \"email\"];\n  string firstname = 2 [(api.form) = \"firstname\"];\n  string lastname = 3 [(api.form) = \"lastname\"];\n  string street = 4 [(api.form) = \"street\"];\n  string zipcode = 5 [(api.form) = \"zipcode\"];\n  string province = 6 [(api.form) = \"province\"];\n  string country = 7 [(api.form) = \"country\"];\n  string city = 8 [(api.form) = \"city\"];\n  string card_num = 9 [(api.form) = \"cardNum\"];\n  int32 expiration_month = 10 [(api.form) = \"expirationMonth\"];\n  int32 expiration_year = 11 [(api.form) = \"expirationYear\"];\n  int32 cvv = 12 [(api.form) = \"cvv\"];\n  string payment = 13 [(api.form) = \"payment\"];\n}\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (common.Empty) {\n    option (api.get) = \"/checkout\";\n  }\n  rpc CheckoutWaiting(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/checkout/waiting\";\n  }\n  rpc CheckoutResult(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/checkout/result\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch14/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\nmessage Empty {}"
  },
  {
    "path": "gomall/tutorial/ch14/idl/frontend/home.proto",
    "content": "syntax = 'proto3';\n\npackage frontend.common;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/home\";\n\nservice HomeService {\n  rpc Home(common.Empty) returns (Empty) { option (api.get) = \"/\"; }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/idl/frontend/order_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.order;\n\noption go_package = \"/frontend/order\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nservice OrderService {\n  rpc OrderList(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/order\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch14/idl/frontend/product_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.product;\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\noption go_package = \"frontend/product\";\n\nmessage ProductReq { uint32 id = 1 [ (api.query) = \"id\" ]; }\n\nservice ProductService {\n  rpc GetProduct(ProductReq) returns (common.Empty) {\n    option (api.get) = \"/product\";\n  };\n}"
  },
  {
    "path": "gomall/tutorial/ch14/idl/order.proto",
    "content": "syntax = \"proto3\";\n\npackage order;\n\nimport \"cart.proto\";\n\noption go_package = \"order\";\n\nservice OrderService {\n  rpc PlaceOrder(PlaceOrderReq) returns (PlaceOrderResp) {}\n  rpc ListOrder(ListOrderReq) returns (ListOrderResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  int32 zip_code = 5;\n}\n\nmessage PlaceOrderReq {\n  uint32 user_id = 1;\n  string user_currency = 2;\n\n  Address address = 3;\n  string email = 4;\n  repeated OrderItem order_items = 5;\n}\n\nmessage OrderItem {\n  cart.CartItem item = 1;\n  float cost = 2;\n}\n\nmessage OrderResult {\n  string order_id = 1;\n}\n\nmessage PlaceOrderResp {\n  OrderResult order = 1;\n}\n\nmessage ListOrderReq {\n  uint32 user_id = 1;\n}\n\nmessage Order {\n  repeated OrderItem order_items = 1;\n  string order_id = 2;\n  uint32 user_id = 3;\n  string user_currency = 4;\n  Address address = 5;\n  string email = 6;\n  int32 created_at = 7;\n}\n\nmessage ListOrderResp {\n  repeated Order orders = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/idl/payment.proto",
    "content": "syntax = \"proto3\";\n\npackage payment;\n\noption go_package = \"payment\";\n\n\nservice PaymentService {\n  rpc Charge(ChargeReq) returns (ChargeResp) {}\n}\n\nmessage CreditCardInfo {\n  string credit_card_number = 1;\n  int32 credit_card_cvv = 2;\n  int32 credit_card_expiration_year = 3;\n  int32 credit_card_expiration_month = 4;\n}\n\nmessage ChargeReq {\n  float amount = 1;\n  CreditCardInfo credit_card = 2;\n  string order_id = 3;\n  uint32 user_id = 4;\n}\n\nmessage ChargeResp {\n  string transaction_id = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/idl/product.proto",
    "content": "syntax = \"proto3\";\n\npackage product;\n\noption go_package = \"/product\";\n\nservice ProductCatalogService {\n  rpc ListProducts(ListProductsReq) returns (ListProductsResp) {}\n  rpc GetProduct(GetProductReq) returns (GetProductResp) {}\n  rpc SearchProducts(SearchProductsReq) returns (SearchProductsResp) {}\n}\n\nmessage ListProductsReq{\n  int32 page = 1;\n  int64 pageSize = 2;\n\n  string categoryName = 3;\n}\n\nmessage Product {\n  uint32 id = 1;\n  string name = 2;\n  string description = 3;\n  string picture = 4;\n  float price = 5;\n\n  repeated string categories = 6;\n}\n\nmessage ListProductsResp {\n  repeated Product products = 1;\n}\n\nmessage GetProductReq {\n  uint32 id = 1;\n}\n\nmessage GetProductResp {\n  Product product = 1;\n}\n\nmessage SearchProductsReq {\n  string query = 1;\n}\n\nmessage SearchProductsResp {\n  repeated Product results = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/idl/user.proto",
    "content": "syntax=\"proto3\";\n\npackage user;\n\noption go_package=\"/user\";\n\nservice UserService {\n    rpc Register(RegisterReq) returns (RegisterResp) {}\n    rpc Login(LoginReq) returns (LoginResp) {}\n}\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string confirm_password = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email= 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.5\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgoogle.golang.org/protobuf v1.36.6\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/cart/cart.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CartItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CartItem[number], err)\n}\n\nfunc (x *CartItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.ProductId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CartItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Quantity, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_AddItemReq[number], err)\n}\n\nfunc (x *AddItemReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *AddItemResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmptyCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmptyCartReq[number], err)\n}\n\nfunc (x *EmptyCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartReq[number], err)\n}\n\nfunc (x *GetCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartResp[number], err)\n}\n\nfunc (x *GetCartResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Cart\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Cart = &v\n\treturn offset, nil\n}\n\nfunc (x *Cart) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Cart[number], err)\n}\n\nfunc (x *Cart) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Cart) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *EmptyCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *CartItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.ProductId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetProductId())\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Quantity == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetQuantity())\n\treturn offset\n}\n\nfunc (x *AddItemReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItem())\n\treturn offset\n}\n\nfunc (x *AddItemResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Cart == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetCart())\n\treturn offset\n}\n\nfunc (x *Cart) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField2(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *CartItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CartItem) sizeField1() (n int) {\n\tif x.ProductId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetProductId())\n\treturn n\n}\n\nfunc (x *CartItem) sizeField2() (n int) {\n\tif x.Quantity == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetQuantity())\n\treturn n\n}\n\nfunc (x *AddItemReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField2() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetItem())\n\treturn n\n}\n\nfunc (x *AddItemResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *EmptyCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartResp) sizeField1() (n int) {\n\tif x.Cart == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetCart())\n\treturn n\n}\n\nfunc (x *Cart) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *Cart) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Cart) sizeField2() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(2, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_CartItem = map[int32]string{\n\t1: \"ProductId\",\n\t2: \"Quantity\",\n}\n\nvar fieldIDToName_AddItemReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Item\",\n}\n\nvar fieldIDToName_AddItemResp = map[int32]string{}\n\nvar fieldIDToName_EmptyCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartResp = map[int32]string{\n\t1: \"Cart\",\n}\n\nvar fieldIDToName_Cart = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Items\",\n}\n\nvar fieldIDToName_EmptyCartResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/cart/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: cart.proto\n\npackage cart\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\"`\n\tQuantity  int32  `protobuf:\"varint,2,opt,name=quantity,proto3\" json:\"quantity,omitempty\"`\n}\n\nfunc (x *CartItem) Reset() {\n\t*x = CartItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartItem) ProtoMessage() {}\n\nfunc (x *CartItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartItem.ProtoReflect.Descriptor instead.\nfunc (*CartItem) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartItem) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetQuantity() int32 {\n\tif x != nil {\n\t\treturn x.Quantity\n\t}\n\treturn 0\n}\n\ntype AddItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32    `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItem   *CartItem `protobuf:\"bytes,2,opt,name=item,proto3\" json:\"item,omitempty\"`\n}\n\nfunc (x *AddItemReq) Reset() {\n\t*x = AddItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemReq) ProtoMessage() {}\n\nfunc (x *AddItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddItemReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *AddItemReq) GetItem() *CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\ntype AddItemResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *AddItemResp) Reset() {\n\t*x = AddItemResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemResp) ProtoMessage() {}\n\nfunc (x *AddItemResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemResp.ProtoReflect.Descriptor instead.\nfunc (*AddItemResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{2}\n}\n\ntype EmptyCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *EmptyCartReq) Reset() {\n\t*x = EmptyCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartReq) ProtoMessage() {}\n\nfunc (x *EmptyCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartReq.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EmptyCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *GetCartReq) Reset() {\n\t*x = GetCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReq) ProtoMessage() {}\n\nfunc (x *GetCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReq.ProtoReflect.Descriptor instead.\nfunc (*GetCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCart *Cart `protobuf:\"bytes,1,opt,name=cart,proto3\" json:\"cart,omitempty\"`\n}\n\nfunc (x *GetCartResp) Reset() {\n\t*x = GetCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartResp) ProtoMessage() {}\n\nfunc (x *GetCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartResp.ProtoReflect.Descriptor instead.\nfunc (*GetCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *GetCartResp) GetCart() *Cart {\n\tif x != nil {\n\t\treturn x.Cart\n\t}\n\treturn nil\n}\n\ntype Cart struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32      `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItems  []*CartItem `protobuf:\"bytes,2,rep,name=items,proto3\" json:\"items,omitempty\"`\n}\n\nfunc (x *Cart) Reset() {\n\t*x = Cart{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Cart) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Cart) ProtoMessage() {}\n\nfunc (x *Cart) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Cart.ProtoReflect.Descriptor instead.\nfunc (*Cart) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Cart) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Cart) GetItems() []*CartItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\ntype EmptyCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmptyCartResp) Reset() {\n\t*x = EmptyCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartResp) ProtoMessage() {}\n\nfunc (x *EmptyCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartResp.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{7}\n}\n\nvar File_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x08, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0a, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04,\n\t0x69, 0x74, 0x65, 0x6d, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x27, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0a,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x1e, 0x0a, 0x04, 0x63, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x52, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x04, 0x43, 0x61, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74,\n\t0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x45, 0x6d, 0x70,\n\t0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x32, 0xa9, 0x01, 0x0a, 0x0b, 0x43,\n\t0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x47,\n\t0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36,\n\t0x0a, 0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x12, 0x12, 0x2e, 0x63, 0x61,\n\t0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a,\n\t0x13, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62,\n\t0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72,\n\t0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_proto_rawDescOnce sync.Once\n\tfile_cart_proto_rawDescData = file_cart_proto_rawDesc\n)\n\nfunc file_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_proto_rawDescData)\n\t})\n\treturn file_cart_proto_rawDescData\n}\n\nvar file_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_cart_proto_goTypes = []interface{}{\n\t(*CartItem)(nil),      // 0: cart.CartItem\n\t(*AddItemReq)(nil),    // 1: cart.AddItemReq\n\t(*AddItemResp)(nil),   // 2: cart.AddItemResp\n\t(*EmptyCartReq)(nil),  // 3: cart.EmptyCartReq\n\t(*GetCartReq)(nil),    // 4: cart.GetCartReq\n\t(*GetCartResp)(nil),   // 5: cart.GetCartResp\n\t(*Cart)(nil),          // 6: cart.Cart\n\t(*EmptyCartResp)(nil), // 7: cart.EmptyCartResp\n}\nvar file_cart_proto_depIdxs = []int32{\n\t0, // 0: cart.AddItemReq.item:type_name -> cart.CartItem\n\t6, // 1: cart.GetCartResp.cart:type_name -> cart.Cart\n\t0, // 2: cart.Cart.items:type_name -> cart.CartItem\n\t1, // 3: cart.CartService.AddItem:input_type -> cart.AddItemReq\n\t4, // 4: cart.CartService.GetCart:input_type -> cart.GetCartReq\n\t3, // 5: cart.CartService.EmptyCart:input_type -> cart.EmptyCartReq\n\t2, // 6: cart.CartService.AddItem:output_type -> cart.AddItemResp\n\t5, // 7: cart.CartService.GetCart:output_type -> cart.GetCartResp\n\t7, // 8: cart.CartService.EmptyCart:output_type -> cart.EmptyCartResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_proto_init() }\nfunc file_cart_proto_init() {\n\tif File_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Cart); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_proto = out.File\n\tfile_cart_proto_rawDesc = nil\n\tfile_cart_proto_goTypes = nil\n\tfile_cart_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CartService interface {\n\tAddItem(ctx context.Context, req *AddItemReq) (res *AddItemResp, err error)\n\tGetCart(ctx context.Context, req *GetCartReq) (res *GetCartResp, err error)\n\tEmptyCart(ctx context.Context, req *EmptyCartReq) (res *EmptyCartResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/cart/cartservice/cartservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfo\n}\n\nvar cartServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CartService\"\n\thandlerType := (*cart.CartService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"AddItem\":   kitex.NewMethodInfo(addItemHandler, newAddItemArgs, newAddItemResult, false),\n\t\t\"GetCart\":   kitex.NewMethodInfo(getCartHandler, newGetCartArgs, newGetCartResult, false),\n\t\t\"EmptyCart\": kitex.NewMethodInfo(emptyCartHandler, newEmptyCartArgs, newEmptyCartResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"cart\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc addItemHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.AddItemReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).AddItem(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *AddItemArgs:\n\t\tsuccess, err := handler.(cart.CartService).AddItem(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*AddItemResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newAddItemArgs() interface{} {\n\treturn &AddItemArgs{}\n}\n\nfunc newAddItemResult() interface{} {\n\treturn &AddItemResult{}\n}\n\ntype AddItemArgs struct {\n\tReq *cart.AddItemReq\n}\n\nfunc (p *AddItemArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.AddItemReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *AddItemArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *AddItemArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *AddItemArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar AddItemArgs_Req_DEFAULT *cart.AddItemReq\n\nfunc (p *AddItemArgs) GetReq() *cart.AddItemReq {\n\tif !p.IsSetReq() {\n\t\treturn AddItemArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *AddItemArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *AddItemArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype AddItemResult struct {\n\tSuccess *cart.AddItemResp\n}\n\nvar AddItemResult_Success_DEFAULT *cart.AddItemResp\n\nfunc (p *AddItemResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.AddItemResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *AddItemResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *AddItemResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *AddItemResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *AddItemResult) GetSuccess() *cart.AddItemResp {\n\tif !p.IsSetSuccess() {\n\t\treturn AddItemResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *AddItemResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.AddItemResp)\n}\n\nfunc (p *AddItemResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *AddItemResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.GetCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).GetCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).GetCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetCartArgs() interface{} {\n\treturn &GetCartArgs{}\n}\n\nfunc newGetCartResult() interface{} {\n\treturn &GetCartResult{}\n}\n\ntype GetCartArgs struct {\n\tReq *cart.GetCartReq\n}\n\nfunc (p *GetCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.GetCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetCartArgs_Req_DEFAULT *cart.GetCartReq\n\nfunc (p *GetCartArgs) GetReq() *cart.GetCartReq {\n\tif !p.IsSetReq() {\n\t\treturn GetCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetCartResult struct {\n\tSuccess *cart.GetCartResp\n}\n\nvar GetCartResult_Success_DEFAULT *cart.GetCartResp\n\nfunc (p *GetCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.GetCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetCartResult) GetSuccess() *cart.GetCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.GetCartResp)\n}\n\nfunc (p *GetCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc emptyCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.EmptyCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).EmptyCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EmptyCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).EmptyCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EmptyCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEmptyCartArgs() interface{} {\n\treturn &EmptyCartArgs{}\n}\n\nfunc newEmptyCartResult() interface{} {\n\treturn &EmptyCartResult{}\n}\n\ntype EmptyCartArgs struct {\n\tReq *cart.EmptyCartReq\n}\n\nfunc (p *EmptyCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.EmptyCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EmptyCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EmptyCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EmptyCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EmptyCartArgs_Req_DEFAULT *cart.EmptyCartReq\n\nfunc (p *EmptyCartArgs) GetReq() *cart.EmptyCartReq {\n\tif !p.IsSetReq() {\n\t\treturn EmptyCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EmptyCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EmptyCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EmptyCartResult struct {\n\tSuccess *cart.EmptyCartResp\n}\n\nvar EmptyCartResult_Success_DEFAULT *cart.EmptyCartResp\n\nfunc (p *EmptyCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.EmptyCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EmptyCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EmptyCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EmptyCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EmptyCartResult) GetSuccess() *cart.EmptyCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn EmptyCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EmptyCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.EmptyCartResp)\n}\n\nfunc (p *EmptyCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EmptyCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) AddItem(ctx context.Context, Req *cart.AddItemReq) (r *cart.AddItemResp, err error) {\n\tvar _args AddItemArgs\n\t_args.Req = Req\n\tvar _result AddItemResult\n\tif err = p.c.Call(ctx, \"AddItem\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetCart(ctx context.Context, Req *cart.GetCartReq) (r *cart.GetCartResp, err error) {\n\tvar _args GetCartArgs\n\t_args.Req = Req\n\tvar _result GetCartResult\n\tif err = p.c.Call(ctx, \"GetCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq) (r *cart.EmptyCartResp, err error) {\n\tvar _args EmptyCartArgs\n\t_args.Req = Req\n\tvar _result EmptyCartResult\n\tif err = p.c.Call(ctx, \"EmptyCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/cart/cartservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCartServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCartServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCartServiceClient) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.AddItem(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetCart(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.EmptyCart(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/cart/cartservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler cart.CartService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/cart/cartservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler cart.CartService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/checkout/checkout.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tfmt \"fmt\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutReq[number], err)\n}\n\nfunc (x *CheckoutReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Firstname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Lastname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutReq) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v payment.CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutResp[number], err)\n}\n\nfunc (x *CheckoutResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutResp) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Firstname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetFirstname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Lastname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetLastname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField6(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 6, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField2(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *CheckoutReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField2() (n int) {\n\tif x.Firstname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetFirstname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField3() (n int) {\n\tif x.Lastname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetLastname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField6() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(6, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *CheckoutResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField2() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_CheckoutReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Firstname\",\n\t3: \"Lastname\",\n\t4: \"Email\",\n\t5: \"Address\",\n\t6: \"CreditCard\",\n}\n\nvar fieldIDToName_CheckoutResp = map[int32]string{\n\t1: \"OrderId\",\n\t2: \"TransactionId\",\n}\n\nvar _ = payment.File_payment_proto\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/checkout/checkout.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: checkout.proto\n\npackage checkout\n\nimport (\n\tcontext \"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       string `protobuf:\"bytes,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() string {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn \"\"\n}\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId     uint32                  `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tFirstname  string                  `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\"`\n\tLastname   string                  `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\"`\n\tEmail      string                  `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tAddress    *Address                `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tCreditCard *payment.CreditCardInfo `protobuf:\"bytes,6,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CheckoutReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *CheckoutReq) GetCreditCard() *payment.CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\ntype CheckoutResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId       string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tTransactionId string `protobuf:\"bytes,2,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *CheckoutResp) Reset() {\n\t*x = CheckoutResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutResp) ProtoMessage() {}\n\nfunc (x *CheckoutResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutResp.ProtoReflect.Descriptor instead.\nfunc (*CheckoutResp) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CheckoutResp) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_proto protoreflect.FileDescriptor\n\nvar file_checkout_proto_rawDesc = []byte{\n\t0x0a, 0x0e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x0d, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f,\n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,\n\t0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,\n\t0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79,\n\t0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x0b,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75,\n\t0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73,\n\t0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x22, 0x50, 0x0a, 0x0c, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,\n\t0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x4e, 0x0a,\n\t0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x3b, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x15, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_proto_rawDescOnce sync.Once\n\tfile_checkout_proto_rawDescData = file_checkout_proto_rawDesc\n)\n\nfunc file_checkout_proto_rawDescGZIP() []byte {\n\tfile_checkout_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_proto_rawDescData)\n\t})\n\treturn file_checkout_proto_rawDescData\n}\n\nvar file_checkout_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_checkout_proto_goTypes = []interface{}{\n\t(*Address)(nil),                // 0: checkout.Address\n\t(*CheckoutReq)(nil),            // 1: checkout.CheckoutReq\n\t(*CheckoutResp)(nil),           // 2: checkout.CheckoutResp\n\t(*payment.CreditCardInfo)(nil), // 3: payment.CreditCardInfo\n}\nvar file_checkout_proto_depIdxs = []int32{\n\t0, // 0: checkout.CheckoutReq.address:type_name -> checkout.Address\n\t3, // 1: checkout.CheckoutReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 2: checkout.CheckoutService.Checkout:input_type -> checkout.CheckoutReq\n\t2, // 3: checkout.CheckoutService.Checkout:output_type -> checkout.CheckoutResp\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_proto_init() }\nfunc file_checkout_proto_init() {\n\tif File_checkout_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_proto = out.File\n\tfile_checkout_proto_rawDesc = nil\n\tfile_checkout_proto_goTypes = nil\n\tfile_checkout_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CheckoutService interface {\n\tCheckout(ctx context.Context, req *CheckoutReq) (res *CheckoutResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/checkout/checkoutservice/checkoutservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfo\n}\n\nvar checkoutServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CheckoutService\"\n\thandlerType := (*checkout.CheckoutService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Checkout\": kitex.NewMethodInfo(checkoutHandler, newCheckoutArgs, newCheckoutResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"checkout\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc checkoutHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(checkout.CheckoutReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(checkout.CheckoutService).Checkout(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *CheckoutArgs:\n\t\tsuccess, err := handler.(checkout.CheckoutService).Checkout(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*CheckoutResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newCheckoutArgs() interface{} {\n\treturn &CheckoutArgs{}\n}\n\nfunc newCheckoutResult() interface{} {\n\treturn &CheckoutResult{}\n}\n\ntype CheckoutArgs struct {\n\tReq *checkout.CheckoutReq\n}\n\nfunc (p *CheckoutArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(checkout.CheckoutReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *CheckoutArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *CheckoutArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *CheckoutArgs) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar CheckoutArgs_Req_DEFAULT *checkout.CheckoutReq\n\nfunc (p *CheckoutArgs) GetReq() *checkout.CheckoutReq {\n\tif !p.IsSetReq() {\n\t\treturn CheckoutArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *CheckoutArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *CheckoutArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype CheckoutResult struct {\n\tSuccess *checkout.CheckoutResp\n}\n\nvar CheckoutResult_Success_DEFAULT *checkout.CheckoutResp\n\nfunc (p *CheckoutResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(checkout.CheckoutResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *CheckoutResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *CheckoutResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *CheckoutResult) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *CheckoutResult) GetSuccess() *checkout.CheckoutResp {\n\tif !p.IsSetSuccess() {\n\t\treturn CheckoutResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *CheckoutResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*checkout.CheckoutResp)\n}\n\nfunc (p *CheckoutResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *CheckoutResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq) (r *checkout.CheckoutResp, err error) {\n\tvar _args CheckoutArgs\n\t_args.Req = Req\n\tvar _result CheckoutResult\n\tif err = p.c.Call(ctx, \"Checkout\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/checkout/checkoutservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCheckoutServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCheckoutServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCheckoutServiceClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Checkout(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/checkout/checkoutservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler checkout.CheckoutService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/checkout/checkoutservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler checkout.CheckoutService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/email/email.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage email\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *EmailReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmailReq[number], err)\n}\n\nfunc (x *EmailReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.From, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.To, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ContentType, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Subject, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Content, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmailReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.From == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetFrom())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.To == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTo())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ContentType == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetContentType())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Subject == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetSubject())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Content == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetContent())\n\treturn offset\n}\n\nfunc (x *EmailResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmailReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField1() (n int) {\n\tif x.From == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetFrom())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField2() (n int) {\n\tif x.To == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTo())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField3() (n int) {\n\tif x.ContentType == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetContentType())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField4() (n int) {\n\tif x.Subject == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetSubject())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField5() (n int) {\n\tif x.Content == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetContent())\n\treturn n\n}\n\nfunc (x *EmailResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_EmailReq = map[int32]string{\n\t1: \"From\",\n\t2: \"To\",\n\t3: \"ContentType\",\n\t4: \"Subject\",\n\t5: \"Content\",\n}\n\nvar fieldIDToName_EmailResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/email/email.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: email.proto\n\npackage email\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype EmailReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFrom        string `protobuf:\"bytes,1,opt,name=from,proto3\" json:\"from,omitempty\"`\n\tTo          string `protobuf:\"bytes,2,opt,name=to,proto3\" json:\"to,omitempty\"`\n\tContentType string `protobuf:\"bytes,3,opt,name=content_type,json=contentType,proto3\" json:\"content_type,omitempty\"`\n\tSubject     string `protobuf:\"bytes,4,opt,name=subject,proto3\" json:\"subject,omitempty\"`\n\tContent     string `protobuf:\"bytes,5,opt,name=content,proto3\" json:\"content,omitempty\"`\n}\n\nfunc (x *EmailReq) Reset() {\n\t*x = EmailReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailReq) ProtoMessage() {}\n\nfunc (x *EmailReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailReq.ProtoReflect.Descriptor instead.\nfunc (*EmailReq) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *EmailReq) GetFrom() string {\n\tif x != nil {\n\t\treturn x.From\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetTo() string {\n\tif x != nil {\n\t\treturn x.To\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContentType() string {\n\tif x != nil {\n\t\treturn x.ContentType\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetSubject() string {\n\tif x != nil {\n\t\treturn x.Subject\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\ntype EmailResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmailResp) Reset() {\n\t*x = EmailResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailResp) ProtoMessage() {}\n\nfunc (x *EmailResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailResp.ProtoReflect.Descriptor instead.\nfunc (*EmailResp) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{1}\n}\n\nvar File_email_proto protoreflect.FileDescriptor\n\nvar file_email_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x08, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65,\n\t0x71, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x0b, 0x0a, 0x09,\n\t0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x32, 0x39, 0x0a, 0x0c, 0x45, 0x6d, 0x61,\n\t0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x53, 0x65, 0x6e,\n\t0x64, 0x12, 0x0f, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52,\n\t0x65, 0x71, 0x1a, 0x10, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c,\n\t0x52, 0x65, 0x73, 0x70, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63,\n\t0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_email_proto_rawDescOnce sync.Once\n\tfile_email_proto_rawDescData = file_email_proto_rawDesc\n)\n\nfunc file_email_proto_rawDescGZIP() []byte {\n\tfile_email_proto_rawDescOnce.Do(func() {\n\t\tfile_email_proto_rawDescData = protoimpl.X.CompressGZIP(file_email_proto_rawDescData)\n\t})\n\treturn file_email_proto_rawDescData\n}\n\nvar file_email_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_email_proto_goTypes = []interface{}{\n\t(*EmailReq)(nil),  // 0: email.EmailReq\n\t(*EmailResp)(nil), // 1: email.EmailResp\n}\nvar file_email_proto_depIdxs = []int32{\n\t0, // 0: email.EmailService.Send:input_type -> email.EmailReq\n\t1, // 1: email.EmailService.Send:output_type -> email.EmailResp\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_email_proto_init() }\nfunc file_email_proto_init() {\n\tif File_email_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_email_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_email_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_email_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_email_proto_goTypes,\n\t\tDependencyIndexes: file_email_proto_depIdxs,\n\t\tMessageInfos:      file_email_proto_msgTypes,\n\t}.Build()\n\tFile_email_proto = out.File\n\tfile_email_proto_rawDesc = nil\n\tfile_email_proto_goTypes = nil\n\tfile_email_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype EmailService interface {\n\tSend(ctx context.Context, req *EmailReq) (res *EmailResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/email/emailservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEmailServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEmailServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kEmailServiceClient) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Send(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/email/emailservice/emailservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn emailServiceServiceInfo\n}\n\nvar emailServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"EmailService\"\n\thandlerType := (*email.EmailService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Send\": kitex.NewMethodInfo(sendHandler, newSendArgs, newSendResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"email\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc sendHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(email.EmailReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(email.EmailService).Send(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SendArgs:\n\t\tsuccess, err := handler.(email.EmailService).Send(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SendResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSendArgs() interface{} {\n\treturn &SendArgs{}\n}\n\nfunc newSendResult() interface{} {\n\treturn &SendResult{}\n}\n\ntype SendArgs struct {\n\tReq *email.EmailReq\n}\n\nfunc (p *SendArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(email.EmailReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SendArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SendArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SendArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SendArgs) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SendArgs_Req_DEFAULT *email.EmailReq\n\nfunc (p *SendArgs) GetReq() *email.EmailReq {\n\tif !p.IsSetReq() {\n\t\treturn SendArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SendArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SendArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SendResult struct {\n\tSuccess *email.EmailResp\n}\n\nvar SendResult_Success_DEFAULT *email.EmailResp\n\nfunc (p *SendResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(email.EmailResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SendResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SendResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SendResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SendResult) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SendResult) GetSuccess() *email.EmailResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SendResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SendResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*email.EmailResp)\n}\n\nfunc (p *SendResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SendResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Send(ctx context.Context, Req *email.EmailReq) (r *email.EmailResp, err error) {\n\tvar _args SendArgs\n\t_args.Req = Req\n\tvar _result SendResult\n\tif err = p.c.Call(ctx, \"Send\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/email/emailservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler email.EmailService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/email/emailservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler email.EmailService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/order/order.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage order\n\nimport (\n\tfmt \"fmt\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderReq[number], err)\n}\n\nfunc (x *PlaceOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *PlaceOrderReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderItem[number], err)\n}\n\nfunc (x *OrderItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v cart.CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Cost, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *OrderResult) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderResult[number], err)\n}\n\nfunc (x *OrderResult) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderResp[number], err)\n}\n\nfunc (x *PlaceOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderResult\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Order = &v\n\treturn offset, nil\n}\n\nfunc (x *ListOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderReq[number], err)\n}\n\nfunc (x *ListOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 7:\n\t\toffset, err = x.fastReadField7(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Order[number], err)\n}\n\nfunc (x *Order) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField7(buf []byte, _type int8) (offset int, err error) {\n\tx.CreatedAt, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderResp[number], err)\n}\n\nfunc (x *ListOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Order\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Orders = append(x.Orders, &v)\n\treturn offset, nil\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 3, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *OrderItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItem())\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Cost == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 2, x.GetCost())\n\treturn offset\n}\n\nfunc (x *OrderResult) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderResult) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Order == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrder())\n\treturn offset\n}\n\nfunc (x *ListOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\toffset += x.fastWriteField7(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField2(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField3(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 3, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField6(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 6, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField7(buf []byte) (offset int) {\n\tif x.CreatedAt == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 7, x.GetCreatedAt())\n\treturn offset\n}\n\nfunc (x *ListOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Orders == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrders() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrders()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField2() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField3() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(3, x.GetAddress())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField5() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(5, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *OrderItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField1() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetItem())\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField2() (n int) {\n\tif x.Cost == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(2, x.GetCost())\n\treturn n\n}\n\nfunc (x *OrderResult) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *OrderResult) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) sizeField1() (n int) {\n\tif x.Order == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetOrder())\n\treturn n\n}\n\nfunc (x *ListOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\tn += x.sizeField7()\n\treturn n\n}\n\nfunc (x *Order) sizeField1() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *Order) sizeField2() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *Order) sizeField3() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(3, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) sizeField4() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *Order) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *Order) sizeField6() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(6, x.GetEmail())\n\treturn n\n}\n\nfunc (x *Order) sizeField7() (n int) {\n\tif x.CreatedAt == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(7, x.GetCreatedAt())\n\treturn n\n}\n\nfunc (x *ListOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderResp) sizeField1() (n int) {\n\tif x.Orders == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrders() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrders()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_PlaceOrderReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"UserCurrency\",\n\t3: \"Address\",\n\t4: \"Email\",\n\t5: \"OrderItems\",\n}\n\nvar fieldIDToName_OrderItem = map[int32]string{\n\t1: \"Item\",\n\t2: \"Cost\",\n}\n\nvar fieldIDToName_OrderResult = map[int32]string{\n\t1: \"OrderId\",\n}\n\nvar fieldIDToName_PlaceOrderResp = map[int32]string{\n\t1: \"Order\",\n}\n\nvar fieldIDToName_ListOrderReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_Order = map[int32]string{\n\t1: \"OrderItems\",\n\t2: \"OrderId\",\n\t3: \"UserId\",\n\t4: \"UserCurrency\",\n\t5: \"Address\",\n\t6: \"Email\",\n\t7: \"CreatedAt\",\n}\n\nvar fieldIDToName_ListOrderResp = map[int32]string{\n\t1: \"Orders\",\n}\n\nvar _ = cart.File_cart_proto\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/order/order.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: order.proto\n\npackage order\n\nimport (\n\tcontext \"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       int32  `protobuf:\"varint,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() int32 {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn 0\n}\n\ntype PlaceOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId       uint32       `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,2,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,3,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tOrderItems   []*OrderItem `protobuf:\"bytes,5,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n}\n\nfunc (x *PlaceOrderReq) Reset() {\n\t*x = PlaceOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderReq) ProtoMessage() {}\n\nfunc (x *PlaceOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderReq.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *PlaceOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *PlaceOrderReq) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *PlaceOrderReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\ntype OrderItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItem *cart.CartItem `protobuf:\"bytes,1,opt,name=item,proto3\" json:\"item,omitempty\"`\n\tCost float32        `protobuf:\"fixed32,2,opt,name=cost,proto3\" json:\"cost,omitempty\"`\n}\n\nfunc (x *OrderItem) Reset() {\n\t*x = OrderItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderItem) ProtoMessage() {}\n\nfunc (x *OrderItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderItem.ProtoReflect.Descriptor instead.\nfunc (*OrderItem) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *OrderItem) GetItem() *cart.CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\nfunc (x *OrderItem) GetCost() float32 {\n\tif x != nil {\n\t\treturn x.Cost\n\t}\n\treturn 0\n}\n\ntype OrderResult struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n}\n\nfunc (x *OrderResult) Reset() {\n\t*x = OrderResult{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderResult) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderResult) ProtoMessage() {}\n\nfunc (x *OrderResult) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderResult.ProtoReflect.Descriptor instead.\nfunc (*OrderResult) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *OrderResult) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\ntype PlaceOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrder *OrderResult `protobuf:\"bytes,1,opt,name=order,proto3\" json:\"order,omitempty\"`\n}\n\nfunc (x *PlaceOrderResp) Reset() {\n\t*x = PlaceOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderResp) ProtoMessage() {}\n\nfunc (x *PlaceOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderResp.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PlaceOrderResp) GetOrder() *OrderResult {\n\tif x != nil {\n\t\treturn x.Order\n\t}\n\treturn nil\n}\n\ntype ListOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ListOrderReq) Reset() {\n\t*x = ListOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderReq) ProtoMessage() {}\n\nfunc (x *ListOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderReq.ProtoReflect.Descriptor instead.\nfunc (*ListOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ListOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype Order struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderItems   []*OrderItem `protobuf:\"bytes,1,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n\tOrderId      string       `protobuf:\"bytes,2,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId       uint32       `protobuf:\"varint,3,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,4,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,6,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tCreatedAt    int32        `protobuf:\"varint,7,opt,name=created_at,json=createdAt,proto3\" json:\"created_at,omitempty\"`\n}\n\nfunc (x *Order) Reset() {\n\t*x = Order{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Order) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Order) ProtoMessage() {}\n\nfunc (x *Order) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Order.ProtoReflect.Descriptor instead.\nfunc (*Order) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Order) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Order) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetCreatedAt() int32 {\n\tif x != nil {\n\t\treturn x.CreatedAt\n\t}\n\treturn 0\n}\n\ntype ListOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrders []*Order `protobuf:\"bytes,1,rep,name=orders,proto3\" json:\"orders,omitempty\"`\n}\n\nfunc (x *ListOrderResp) Reset() {\n\t*x = ListOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderResp) ProtoMessage() {}\n\nfunc (x *ListOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderResp.ProtoReflect.Descriptor instead.\nfunc (*ListOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ListOrderResp) GetOrders() []*Order {\n\tif x != nil {\n\t\treturn x.Orders\n\t}\n\treturn nil\n}\n\nvar File_order_proto protoreflect.FileDescriptor\n\nvar file_order_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x1a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a,\n\t0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,\n\t0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63,\n\t0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f,\n\t0x64, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65,\n\t0x72, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a,\n\t0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e,\n\t0x63, 0x79, 0x12, 0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05,\n\t0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d,\n\t0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e,\n\t0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x43, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74,\n\t0x65, 0x6d, 0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d,\n\t0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x28, 0x0a, 0x0b, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x22, 0x27, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf2, 0x01, 0x0a, 0x05, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65,\n\t0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65,\n\t0x72, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49,\n\t0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12,\n\t0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x35,\n\t0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12,\n\t0x24, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x0c, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x73, 0x32, 0x85, 0x01, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f,\n\t0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61,\n\t0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73,\n\t0x70, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72,\n\t0x12, 0x13, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3e, 0x5a,\n\t0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_order_proto_rawDescOnce sync.Once\n\tfile_order_proto_rawDescData = file_order_proto_rawDesc\n)\n\nfunc file_order_proto_rawDescGZIP() []byte {\n\tfile_order_proto_rawDescOnce.Do(func() {\n\t\tfile_order_proto_rawDescData = protoimpl.X.CompressGZIP(file_order_proto_rawDescData)\n\t})\n\treturn file_order_proto_rawDescData\n}\n\nvar file_order_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_order_proto_goTypes = []interface{}{\n\t(*Address)(nil),        // 0: order.Address\n\t(*PlaceOrderReq)(nil),  // 1: order.PlaceOrderReq\n\t(*OrderItem)(nil),      // 2: order.OrderItem\n\t(*OrderResult)(nil),    // 3: order.OrderResult\n\t(*PlaceOrderResp)(nil), // 4: order.PlaceOrderResp\n\t(*ListOrderReq)(nil),   // 5: order.ListOrderReq\n\t(*Order)(nil),          // 6: order.Order\n\t(*ListOrderResp)(nil),  // 7: order.ListOrderResp\n\t(*cart.CartItem)(nil),  // 8: cart.CartItem\n}\nvar file_order_proto_depIdxs = []int32{\n\t0, // 0: order.PlaceOrderReq.address:type_name -> order.Address\n\t2, // 1: order.PlaceOrderReq.order_items:type_name -> order.OrderItem\n\t8, // 2: order.OrderItem.item:type_name -> cart.CartItem\n\t3, // 3: order.PlaceOrderResp.order:type_name -> order.OrderResult\n\t2, // 4: order.Order.order_items:type_name -> order.OrderItem\n\t0, // 5: order.Order.address:type_name -> order.Address\n\t6, // 6: order.ListOrderResp.orders:type_name -> order.Order\n\t1, // 7: order.OrderService.PlaceOrder:input_type -> order.PlaceOrderReq\n\t5, // 8: order.OrderService.ListOrder:input_type -> order.ListOrderReq\n\t4, // 9: order.OrderService.PlaceOrder:output_type -> order.PlaceOrderResp\n\t7, // 10: order.OrderService.ListOrder:output_type -> order.ListOrderResp\n\t9, // [9:11] is the sub-list for method output_type\n\t7, // [7:9] is the sub-list for method input_type\n\t7, // [7:7] is the sub-list for extension type_name\n\t7, // [7:7] is the sub-list for extension extendee\n\t0, // [0:7] is the sub-list for field type_name\n}\n\nfunc init() { file_order_proto_init() }\nfunc file_order_proto_init() {\n\tif File_order_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_order_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderResult); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Order); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_proto_goTypes,\n\t\tDependencyIndexes: file_order_proto_depIdxs,\n\t\tMessageInfos:      file_order_proto_msgTypes,\n\t}.Build()\n\tFile_order_proto = out.File\n\tfile_order_proto_rawDesc = nil\n\tfile_order_proto_goTypes = nil\n\tfile_order_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype OrderService interface {\n\tPlaceOrder(ctx context.Context, req *PlaceOrderReq) (res *PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, req *ListOrderReq) (res *ListOrderResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/order/orderservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kOrderServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kOrderServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kOrderServiceClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.PlaceOrder(ctx, Req)\n}\n\nfunc (p *kOrderServiceClient) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListOrder(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/order/orderservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler order.OrderService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/order/orderservice/orderservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn orderServiceServiceInfo\n}\n\nvar orderServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"OrderService\"\n\thandlerType := (*order.OrderService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"PlaceOrder\": kitex.NewMethodInfo(placeOrderHandler, newPlaceOrderArgs, newPlaceOrderResult, false),\n\t\t\"ListOrder\":  kitex.NewMethodInfo(listOrderHandler, newListOrderArgs, newListOrderResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"order\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc placeOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.PlaceOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).PlaceOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *PlaceOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).PlaceOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*PlaceOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newPlaceOrderArgs() interface{} {\n\treturn &PlaceOrderArgs{}\n}\n\nfunc newPlaceOrderResult() interface{} {\n\treturn &PlaceOrderResult{}\n}\n\ntype PlaceOrderArgs struct {\n\tReq *order.PlaceOrderReq\n}\n\nfunc (p *PlaceOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.PlaceOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *PlaceOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *PlaceOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar PlaceOrderArgs_Req_DEFAULT *order.PlaceOrderReq\n\nfunc (p *PlaceOrderArgs) GetReq() *order.PlaceOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn PlaceOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *PlaceOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PlaceOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype PlaceOrderResult struct {\n\tSuccess *order.PlaceOrderResp\n}\n\nvar PlaceOrderResult_Success_DEFAULT *order.PlaceOrderResp\n\nfunc (p *PlaceOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.PlaceOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *PlaceOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *PlaceOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *PlaceOrderResult) GetSuccess() *order.PlaceOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn PlaceOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *PlaceOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.PlaceOrderResp)\n}\n\nfunc (p *PlaceOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PlaceOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc listOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.ListOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).ListOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).ListOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListOrderArgs() interface{} {\n\treturn &ListOrderArgs{}\n}\n\nfunc newListOrderResult() interface{} {\n\treturn &ListOrderResult{}\n}\n\ntype ListOrderArgs struct {\n\tReq *order.ListOrderReq\n}\n\nfunc (p *ListOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.ListOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListOrderArgs_Req_DEFAULT *order.ListOrderReq\n\nfunc (p *ListOrderArgs) GetReq() *order.ListOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn ListOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListOrderResult struct {\n\tSuccess *order.ListOrderResp\n}\n\nvar ListOrderResult_Success_DEFAULT *order.ListOrderResp\n\nfunc (p *ListOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.ListOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListOrderResult) GetSuccess() *order.ListOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.ListOrderResp)\n}\n\nfunc (p *ListOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq) (r *order.PlaceOrderResp, err error) {\n\tvar _args PlaceOrderArgs\n\t_args.Req = Req\n\tvar _result PlaceOrderResult\n\tif err = p.c.Call(ctx, \"PlaceOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) ListOrder(ctx context.Context, Req *order.ListOrderReq) (r *order.ListOrderResp, err error) {\n\tvar _args ListOrderArgs\n\t_args.Req = Req\n\tvar _result ListOrderResult\n\tif err = p.c.Call(ctx, \"ListOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/order/orderservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler order.OrderService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/payment/payment.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage payment\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CreditCardInfo) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CreditCardInfo[number], err)\n}\n\nfunc (x *CreditCardInfo) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardNumber, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardCvv, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationYear, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationMonth, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeReq[number], err)\n}\n\nfunc (x *ChargeReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Amount, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *ChargeReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeResp[number], err)\n}\n\nfunc (x *ChargeResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField1(buf []byte) (offset int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetCreditCardNumber())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetCreditCardCvv())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField3(buf []byte) (offset int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 3, x.GetCreditCardExpirationYear())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField4(buf []byte) (offset int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 4, x.GetCreditCardExpirationMonth())\n\treturn offset\n}\n\nfunc (x *ChargeReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Amount == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 1, x.GetAmount())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 4, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *ChargeResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField1() (n int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetCreditCardNumber())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField2() (n int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetCreditCardCvv())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField3() (n int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(3, x.GetCreditCardExpirationYear())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField4() (n int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(4, x.GetCreditCardExpirationMonth())\n\treturn n\n}\n\nfunc (x *ChargeReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField1() (n int) {\n\tif x.Amount == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(1, x.GetAmount())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField2() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField3() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField4() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(4, x.GetUserId())\n\treturn n\n}\n\nfunc (x *ChargeResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ChargeResp) sizeField1() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_CreditCardInfo = map[int32]string{\n\t1: \"CreditCardNumber\",\n\t2: \"CreditCardCvv\",\n\t3: \"CreditCardExpirationYear\",\n\t4: \"CreditCardExpirationMonth\",\n}\n\nvar fieldIDToName_ChargeReq = map[int32]string{\n\t1: \"Amount\",\n\t2: \"CreditCard\",\n\t3: \"OrderId\",\n\t4: \"UserId\",\n}\n\nvar fieldIDToName_ChargeResp = map[int32]string{\n\t1: \"TransactionId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/payment/payment.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: payment.proto\n\npackage payment\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CreditCardInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCreditCardNumber          string `protobuf:\"bytes,1,opt,name=credit_card_number,json=creditCardNumber,proto3\" json:\"credit_card_number,omitempty\"`\n\tCreditCardCvv             int32  `protobuf:\"varint,2,opt,name=credit_card_cvv,json=creditCardCvv,proto3\" json:\"credit_card_cvv,omitempty\"`\n\tCreditCardExpirationYear  int32  `protobuf:\"varint,3,opt,name=credit_card_expiration_year,json=creditCardExpirationYear,proto3\" json:\"credit_card_expiration_year,omitempty\"`\n\tCreditCardExpirationMonth int32  `protobuf:\"varint,4,opt,name=credit_card_expiration_month,json=creditCardExpirationMonth,proto3\" json:\"credit_card_expiration_month,omitempty\"`\n}\n\nfunc (x *CreditCardInfo) Reset() {\n\t*x = CreditCardInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreditCardInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreditCardInfo) ProtoMessage() {}\n\nfunc (x *CreditCardInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreditCardInfo.ProtoReflect.Descriptor instead.\nfunc (*CreditCardInfo) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreditCardInfo) GetCreditCardNumber() string {\n\tif x != nil {\n\t\treturn x.CreditCardNumber\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreditCardInfo) GetCreditCardCvv() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardCvv\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationMonth\n\t}\n\treturn 0\n}\n\ntype ChargeReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAmount     float32         `protobuf:\"fixed32,1,opt,name=amount,proto3\" json:\"amount,omitempty\"`\n\tCreditCard *CreditCardInfo `protobuf:\"bytes,2,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n\tOrderId    string          `protobuf:\"bytes,3,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId     uint32          `protobuf:\"varint,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ChargeReq) Reset() {\n\t*x = ChargeReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeReq) ProtoMessage() {}\n\nfunc (x *ChargeReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeReq.ProtoReflect.Descriptor instead.\nfunc (*ChargeReq) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ChargeReq) GetAmount() float32 {\n\tif x != nil {\n\t\treturn x.Amount\n\t}\n\treturn 0\n}\n\nfunc (x *ChargeReq) GetCreditCard() *CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\nfunc (x *ChargeReq) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *ChargeReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype ChargeResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTransactionId string `protobuf:\"bytes,1,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *ChargeResp) Reset() {\n\t*x = ChargeResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeResp) ProtoMessage() {}\n\nfunc (x *ChargeResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeResp.ProtoReflect.Descriptor instead.\nfunc (*ChargeResp) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ChargeResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_payment_proto protoreflect.FileDescriptor\n\nvar file_payment_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x12, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65,\n\t0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43,\n\t0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x76, 0x76, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x43, 0x76,\n\t0x76, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61, 0x72,\n\t0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f,\n\t0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x6e, 0x74,\n\t0x68, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12,\n\t0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52,\n\t0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69,\n\t0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,\n\t0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,\n\t0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75,\n\t0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61,\n\t0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x45, 0x0a, 0x0e, 0x50, 0x61,\n\t0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x06,\n\t0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x61, 0x79,\n\t0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_payment_proto_rawDescOnce sync.Once\n\tfile_payment_proto_rawDescData = file_payment_proto_rawDesc\n)\n\nfunc file_payment_proto_rawDescGZIP() []byte {\n\tfile_payment_proto_rawDescOnce.Do(func() {\n\t\tfile_payment_proto_rawDescData = protoimpl.X.CompressGZIP(file_payment_proto_rawDescData)\n\t})\n\treturn file_payment_proto_rawDescData\n}\n\nvar file_payment_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_payment_proto_goTypes = []interface{}{\n\t(*CreditCardInfo)(nil), // 0: payment.CreditCardInfo\n\t(*ChargeReq)(nil),      // 1: payment.ChargeReq\n\t(*ChargeResp)(nil),     // 2: payment.ChargeResp\n}\nvar file_payment_proto_depIdxs = []int32{\n\t0, // 0: payment.ChargeReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 1: payment.PaymentService.Charge:input_type -> payment.ChargeReq\n\t2, // 2: payment.PaymentService.Charge:output_type -> payment.ChargeResp\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_payment_proto_init() }\nfunc file_payment_proto_init() {\n\tif File_payment_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_payment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreditCardInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_payment_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_payment_proto_goTypes,\n\t\tDependencyIndexes: file_payment_proto_depIdxs,\n\t\tMessageInfos:      file_payment_proto_msgTypes,\n\t}.Build()\n\tFile_payment_proto = out.File\n\tfile_payment_proto_rawDesc = nil\n\tfile_payment_proto_goTypes = nil\n\tfile_payment_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype PaymentService interface {\n\tCharge(ctx context.Context, req *ChargeReq) (res *ChargeResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/payment/paymentservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kPaymentServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kPaymentServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kPaymentServiceClient) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Charge(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/payment/paymentservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler payment.PaymentService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/payment/paymentservice/paymentservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfo\n}\n\nvar paymentServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"PaymentService\"\n\thandlerType := (*payment.PaymentService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Charge\": kitex.NewMethodInfo(chargeHandler, newChargeArgs, newChargeResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"payment\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc chargeHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(payment.ChargeReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(payment.PaymentService).Charge(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ChargeArgs:\n\t\tsuccess, err := handler.(payment.PaymentService).Charge(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ChargeResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newChargeArgs() interface{} {\n\treturn &ChargeArgs{}\n}\n\nfunc newChargeResult() interface{} {\n\treturn &ChargeResult{}\n}\n\ntype ChargeArgs struct {\n\tReq *payment.ChargeReq\n}\n\nfunc (p *ChargeArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(payment.ChargeReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ChargeArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ChargeArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ChargeArgs) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ChargeArgs_Req_DEFAULT *payment.ChargeReq\n\nfunc (p *ChargeArgs) GetReq() *payment.ChargeReq {\n\tif !p.IsSetReq() {\n\t\treturn ChargeArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ChargeArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ChargeArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ChargeResult struct {\n\tSuccess *payment.ChargeResp\n}\n\nvar ChargeResult_Success_DEFAULT *payment.ChargeResp\n\nfunc (p *ChargeResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(payment.ChargeResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ChargeResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ChargeResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ChargeResult) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ChargeResult) GetSuccess() *payment.ChargeResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ChargeResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ChargeResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*payment.ChargeResp)\n}\n\nfunc (p *ChargeResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ChargeResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Charge(ctx context.Context, Req *payment.ChargeReq) (r *payment.ChargeResp, err error) {\n\tvar _args ChargeArgs\n\t_args.Req = Req\n\tvar _result ChargeResult\n\tif err = p.c.Call(ctx, \"Charge\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/payment/paymentservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler payment.PaymentService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/product/product.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *ListProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsReq[number], err)\n}\n\nfunc (x *ListProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Page, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.PageSize, offset, err = fastpb.ReadInt64(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CategoryName, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Product[number], err)\n}\n\nfunc (x *Product) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Name, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Description, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Picture, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Price, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v string\n\tv, offset, err = fastpb.ReadString(buf, _type)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Categories = append(x.Categories, v)\n\treturn offset, err\n}\n\nfunc (x *ListProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsResp[number], err)\n}\n\nfunc (x *ListProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Products = append(x.Products, &v)\n\treturn offset, nil\n}\n\nfunc (x *GetProductReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductReq[number], err)\n}\n\nfunc (x *GetProductReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetProductResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductResp[number], err)\n}\n\nfunc (x *GetProductResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Product = &v\n\treturn offset, nil\n}\n\nfunc (x *SearchProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsReq[number], err)\n}\n\nfunc (x *SearchProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Query, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *SearchProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsResp[number], err)\n}\n\nfunc (x *SearchProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Results = append(x.Results, &v)\n\treturn offset, nil\n}\n\nfunc (x *ListProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Page == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetPage())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.PageSize == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt64(buf[offset:], 2, x.GetPageSize())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.CategoryName == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetCategoryName())\n\treturn offset\n}\n\nfunc (x *Product) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField2(buf []byte) (offset int) {\n\tif x.Name == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetName())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField3(buf []byte) (offset int) {\n\tif x.Description == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetDescription())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField4(buf []byte) (offset int) {\n\tif x.Picture == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetPicture())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField5(buf []byte) (offset int) {\n\tif x.Price == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 5, x.GetPrice())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField6(buf []byte) (offset int) {\n\tif len(x.Categories) == 0 {\n\t\treturn offset\n\t}\n\tfor i := range x.GetCategories() {\n\t\toffset += fastpb.WriteString(buf[offset:], 6, x.GetCategories()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Products == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetProducts() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProducts()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *GetProductReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *GetProductResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Product == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProduct())\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Query == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetQuery())\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Results == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetResults() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetResults()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField1() (n int) {\n\tif x.Page == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetPage())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField2() (n int) {\n\tif x.PageSize == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt64(2, x.GetPageSize())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField3() (n int) {\n\tif x.CategoryName == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetCategoryName())\n\treturn n\n}\n\nfunc (x *Product) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Product) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *Product) sizeField2() (n int) {\n\tif x.Name == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetName())\n\treturn n\n}\n\nfunc (x *Product) sizeField3() (n int) {\n\tif x.Description == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetDescription())\n\treturn n\n}\n\nfunc (x *Product) sizeField4() (n int) {\n\tif x.Picture == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetPicture())\n\treturn n\n}\n\nfunc (x *Product) sizeField5() (n int) {\n\tif x.Price == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(5, x.GetPrice())\n\treturn n\n}\n\nfunc (x *Product) sizeField6() (n int) {\n\tif len(x.Categories) == 0 {\n\t\treturn n\n\t}\n\tfor i := range x.GetCategories() {\n\t\tn += fastpb.SizeString(6, x.GetCategories()[i])\n\t}\n\treturn n\n}\n\nfunc (x *ListProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListProductsResp) sizeField1() (n int) {\n\tif x.Products == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetProducts() {\n\t\tn += fastpb.SizeMessage(1, x.GetProducts()[i])\n\t}\n\treturn n\n}\n\nfunc (x *GetProductReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductReq) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *GetProductResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductResp) sizeField1() (n int) {\n\tif x.Product == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetProduct())\n\treturn n\n}\n\nfunc (x *SearchProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsReq) sizeField1() (n int) {\n\tif x.Query == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetQuery())\n\treturn n\n}\n\nfunc (x *SearchProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsResp) sizeField1() (n int) {\n\tif x.Results == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetResults() {\n\t\tn += fastpb.SizeMessage(1, x.GetResults()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_ListProductsReq = map[int32]string{\n\t1: \"Page\",\n\t2: \"PageSize\",\n\t3: \"CategoryName\",\n}\n\nvar fieldIDToName_Product = map[int32]string{\n\t1: \"Id\",\n\t2: \"Name\",\n\t3: \"Description\",\n\t4: \"Picture\",\n\t5: \"Price\",\n\t6: \"Categories\",\n}\n\nvar fieldIDToName_ListProductsResp = map[int32]string{\n\t1: \"Products\",\n}\n\nvar fieldIDToName_GetProductReq = map[int32]string{\n\t1: \"Id\",\n}\n\nvar fieldIDToName_GetProductResp = map[int32]string{\n\t1: \"Product\",\n}\n\nvar fieldIDToName_SearchProductsReq = map[int32]string{\n\t1: \"Query\",\n}\n\nvar fieldIDToName_SearchProductsResp = map[int32]string{\n\t1: \"Results\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/product/product.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: product.proto\n\npackage product\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPage         int32  `protobuf:\"varint,1,opt,name=page,proto3\" json:\"page,omitempty\"`\n\tPageSize     int64  `protobuf:\"varint,2,opt,name=pageSize,proto3\" json:\"pageSize,omitempty\"`\n\tCategoryName string `protobuf:\"bytes,3,opt,name=categoryName,proto3\" json:\"categoryName,omitempty\"`\n}\n\nfunc (x *ListProductsReq) Reset() {\n\t*x = ListProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsReq) ProtoMessage() {}\n\nfunc (x *ListProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsReq.ProtoReflect.Descriptor instead.\nfunc (*ListProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListProductsReq) GetPage() int32 {\n\tif x != nil {\n\t\treturn x.Page\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetPageSize() int64 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetCategoryName() string {\n\tif x != nil {\n\t\treturn x.CategoryName\n\t}\n\treturn \"\"\n}\n\ntype Product struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          uint32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string   `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tPicture     string   `protobuf:\"bytes,4,opt,name=picture,proto3\" json:\"picture,omitempty\"`\n\tPrice       float32  `protobuf:\"fixed32,5,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tCategories  []string `protobuf:\"bytes,6,rep,name=categories,proto3\" json:\"categories,omitempty\"`\n}\n\nfunc (x *Product) Reset() {\n\t*x = Product{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Product) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Product) ProtoMessage() {}\n\nfunc (x *Product) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Product.ProtoReflect.Descriptor instead.\nfunc (*Product) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Product) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPicture() string {\n\tif x != nil {\n\t\treturn x.Picture\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPrice() float32 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetCategories() []string {\n\tif x != nil {\n\t\treturn x.Categories\n\t}\n\treturn nil\n}\n\ntype ListProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProducts []*Product `protobuf:\"bytes,1,rep,name=products,proto3\" json:\"products,omitempty\"`\n}\n\nfunc (x *ListProductsResp) Reset() {\n\t*x = ListProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsResp) ProtoMessage() {}\n\nfunc (x *ListProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsResp.ProtoReflect.Descriptor instead.\nfunc (*ListProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListProductsResp) GetProducts() []*Product {\n\tif x != nil {\n\t\treturn x.Products\n\t}\n\treturn nil\n}\n\ntype GetProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetProductReq) Reset() {\n\t*x = GetProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductReq) ProtoMessage() {}\n\nfunc (x *GetProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductReq.ProtoReflect.Descriptor instead.\nfunc (*GetProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetProductResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProduct *Product `protobuf:\"bytes,1,opt,name=product,proto3\" json:\"product,omitempty\"`\n}\n\nfunc (x *GetProductResp) Reset() {\n\t*x = GetProductResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductResp) ProtoMessage() {}\n\nfunc (x *GetProductResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductResp.ProtoReflect.Descriptor instead.\nfunc (*GetProductResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetProductResp) GetProduct() *Product {\n\tif x != nil {\n\t\treturn x.Product\n\t}\n\treturn nil\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *SearchProductsReq) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\ntype SearchProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*Product `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *SearchProductsResp) Reset() {\n\t*x = SearchProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsResp) ProtoMessage() {}\n\nfunc (x *SearchProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsResp.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SearchProductsResp) GetResults() []*Product {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_product_proto protoreflect.FileDescriptor\n\nvar file_product_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x65, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12,\n\t0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63,\n\t0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22,\n\t0x9f, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70,\n\t0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63,\n\t0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18,\n\t0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65,\n\t0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,\n\t0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x40, 0x0a,\n\t0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x32,\n\t0xec, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x61, 0x74, 0x61, 0x6c,\n\t0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x4c, 0x69, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x12, 0x3f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x16,\n\t0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x12, 0x4b, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65,\n\t0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x1a,\n\t0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x40,\n\t0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b,\n\t0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_proto_rawDescOnce sync.Once\n\tfile_product_proto_rawDescData = file_product_proto_rawDesc\n)\n\nfunc file_product_proto_rawDescGZIP() []byte {\n\tfile_product_proto_rawDescOnce.Do(func() {\n\t\tfile_product_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_proto_rawDescData)\n\t})\n\treturn file_product_proto_rawDescData\n}\n\nvar file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_product_proto_goTypes = []interface{}{\n\t(*ListProductsReq)(nil),    // 0: product.ListProductsReq\n\t(*Product)(nil),            // 1: product.Product\n\t(*ListProductsResp)(nil),   // 2: product.ListProductsResp\n\t(*GetProductReq)(nil),      // 3: product.GetProductReq\n\t(*GetProductResp)(nil),     // 4: product.GetProductResp\n\t(*SearchProductsReq)(nil),  // 5: product.SearchProductsReq\n\t(*SearchProductsResp)(nil), // 6: product.SearchProductsResp\n}\nvar file_product_proto_depIdxs = []int32{\n\t1, // 0: product.ListProductsResp.products:type_name -> product.Product\n\t1, // 1: product.GetProductResp.product:type_name -> product.Product\n\t1, // 2: product.SearchProductsResp.results:type_name -> product.Product\n\t0, // 3: product.ProductCatalogService.ListProducts:input_type -> product.ListProductsReq\n\t3, // 4: product.ProductCatalogService.GetProduct:input_type -> product.GetProductReq\n\t5, // 5: product.ProductCatalogService.SearchProducts:input_type -> product.SearchProductsReq\n\t2, // 6: product.ProductCatalogService.ListProducts:output_type -> product.ListProductsResp\n\t4, // 7: product.ProductCatalogService.GetProduct:output_type -> product.GetProductResp\n\t6, // 8: product.ProductCatalogService.SearchProducts:output_type -> product.SearchProductsResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_product_proto_init() }\nfunc file_product_proto_init() {\n\tif File_product_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Product); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_proto_goTypes,\n\t\tDependencyIndexes: file_product_proto_depIdxs,\n\t\tMessageInfos:      file_product_proto_msgTypes,\n\t}.Build()\n\tFile_product_proto = out.File\n\tfile_product_proto_rawDesc = nil\n\tfile_product_proto_goTypes = nil\n\tfile_product_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype ProductCatalogService interface {\n\tListProducts(ctx context.Context, req *ListProductsReq) (res *ListProductsResp, err error)\n\tGetProduct(ctx context.Context, req *GetProductReq) (res *GetProductResp, err error)\n\tSearchProducts(ctx context.Context, req *SearchProductsReq) (res *SearchProductsResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/product/productcatalogservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductCatalogServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductCatalogServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductCatalogServiceClient) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.SearchProducts(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/product/productcatalogservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductCatalogService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/product/productcatalogservice/productcatalogservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfo\n}\n\nvar productCatalogServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"ProductCatalogService\"\n\thandlerType := (*product.ProductCatalogService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"ListProducts\":   kitex.NewMethodInfo(listProductsHandler, newListProductsArgs, newListProductsResult, false),\n\t\t\"GetProduct\":     kitex.NewMethodInfo(getProductHandler, newGetProductArgs, newGetProductResult, false),\n\t\t\"SearchProducts\": kitex.NewMethodInfo(searchProductsHandler, newSearchProductsArgs, newSearchProductsResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"product\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.ListProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).ListProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).ListProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListProductsArgs() interface{} {\n\treturn &ListProductsArgs{}\n}\n\nfunc newListProductsResult() interface{} {\n\treturn &ListProductsResult{}\n}\n\ntype ListProductsArgs struct {\n\tReq *product.ListProductsReq\n}\n\nfunc (p *ListProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.ListProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListProductsArgs_Req_DEFAULT *product.ListProductsReq\n\nfunc (p *ListProductsArgs) GetReq() *product.ListProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn ListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListProductsResult struct {\n\tSuccess *product.ListProductsResp\n}\n\nvar ListProductsResult_Success_DEFAULT *product.ListProductsResp\n\nfunc (p *ListProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.ListProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListProductsResult) GetSuccess() *product.ListProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.ListProductsResp)\n}\n\nfunc (p *ListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.GetProductReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).GetProduct(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetProductArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).GetProduct(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetProductResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetProductArgs() interface{} {\n\treturn &GetProductArgs{}\n}\n\nfunc newGetProductResult() interface{} {\n\treturn &GetProductResult{}\n}\n\ntype GetProductArgs struct {\n\tReq *product.GetProductReq\n}\n\nfunc (p *GetProductArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.GetProductReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetProductArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetProductArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetProductArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetProductArgs_Req_DEFAULT *product.GetProductReq\n\nfunc (p *GetProductArgs) GetReq() *product.GetProductReq {\n\tif !p.IsSetReq() {\n\t\treturn GetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetProductResult struct {\n\tSuccess *product.GetProductResp\n}\n\nvar GetProductResult_Success_DEFAULT *product.GetProductResp\n\nfunc (p *GetProductResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.GetProductResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetProductResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetProductResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetProductResult) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetProductResult) GetSuccess() *product.GetProductResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.GetProductResp)\n}\n\nfunc (p *GetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc searchProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.SearchProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).SearchProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SearchProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).SearchProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SearchProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSearchProductsArgs() interface{} {\n\treturn &SearchProductsArgs{}\n}\n\nfunc newSearchProductsResult() interface{} {\n\treturn &SearchProductsResult{}\n}\n\ntype SearchProductsArgs struct {\n\tReq *product.SearchProductsReq\n}\n\nfunc (p *SearchProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.SearchProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SearchProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SearchProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SearchProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SearchProductsArgs_Req_DEFAULT *product.SearchProductsReq\n\nfunc (p *SearchProductsArgs) GetReq() *product.SearchProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn SearchProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SearchProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SearchProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SearchProductsResult struct {\n\tSuccess *product.SearchProductsResp\n}\n\nvar SearchProductsResult_Success_DEFAULT *product.SearchProductsResp\n\nfunc (p *SearchProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.SearchProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SearchProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SearchProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SearchProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SearchProductsResult) GetSuccess() *product.SearchProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SearchProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SearchProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.SearchProductsResp)\n}\n\nfunc (p *SearchProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SearchProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, Req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args ListProductsArgs\n\t_args.Req = Req\n\tvar _result ListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, Req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args GetProductArgs\n\t_args.Req = Req\n\tvar _result GetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq) (r *product.SearchProductsResp, err error) {\n\tvar _args SearchProductsArgs\n\t_args.Req = Req\n\tvar _result SearchProductsResult\n\tif err = p.c.Call(ctx, \"SearchProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/product/productcatalogservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductCatalogService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ConfirmPassword, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetConfirmPassword())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetConfirmPassword())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"ConfirmPassword\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Register\": kitex.NewMethodInfo(registerHandler, newRegisterArgs, newRegisterResult, false),\n\t\t\"Login\":    kitex.NewMethodInfo(loginHandler, newLoginArgs, newLoginResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"user\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/cart/cart_client.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() cartservice.Client\n\tService() string\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := cartservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient cartservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() cartservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\treturn c.kitexClient.AddItem(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\treturn c.kitexClient.GetCart(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\treturn c.kitexClient.EmptyCart(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/cart/cart_default.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc AddItem(ctx context.Context, req *cart.AddItemReq, callOptions ...callopt.Option) (resp *cart.AddItemResp, err error) {\n\tresp, err = defaultClient.AddItem(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"AddItem call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetCart(ctx context.Context, req *cart.GetCartReq, callOptions ...callopt.Option) (resp *cart.GetCartResp, err error) {\n\tresp, err = defaultClient.GetCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc EmptyCart(ctx context.Context, req *cart.EmptyCartReq, callOptions ...callopt.Option) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = defaultClient.EmptyCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"EmptyCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/cart/cart_init.go",
    "content": "package cart\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"cart\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/checkout/checkout_client.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() checkoutservice.Client\n\tService() string\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := checkoutservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient checkoutservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() checkoutservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\treturn c.kitexClient.Checkout(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/checkout/checkout_default.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Checkout(ctx context.Context, req *checkout.CheckoutReq, callOptions ...callopt.Option) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = defaultClient.Checkout(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Checkout call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/checkout/checkout_init.go",
    "content": "package checkout\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"checkout\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/email/email_client.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() emailservice.Client\n\tService() string\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := emailservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient emailservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() emailservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\treturn c.kitexClient.Send(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/email/email_default.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Send(ctx context.Context, req *email.EmailReq, callOptions ...callopt.Option) (resp *email.EmailResp, err error) {\n\tresp, err = defaultClient.Send(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Send call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/email/email_init.go",
    "content": "package email\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"email\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/order/order_client.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() orderservice.Client\n\tService() string\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := orderservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient orderservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() orderservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\treturn c.kitexClient.PlaceOrder(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\treturn c.kitexClient.ListOrder(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/order/order_default.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc PlaceOrder(ctx context.Context, req *order.PlaceOrderReq, callOptions ...callopt.Option) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = defaultClient.PlaceOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"PlaceOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc ListOrder(ctx context.Context, req *order.ListOrderReq, callOptions ...callopt.Option) (resp *order.ListOrderResp, err error) {\n\tresp, err = defaultClient.ListOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/order/order_init.go",
    "content": "package order\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"order\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/payment/payment_client.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() paymentservice.Client\n\tService() string\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := paymentservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient paymentservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() paymentservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\treturn c.kitexClient.Charge(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/payment/payment_default.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Charge(ctx context.Context, req *payment.ChargeReq, callOptions ...callopt.Option) (resp *payment.ChargeResp, err error) {\n\tresp, err = defaultClient.Charge(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Charge call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/payment/payment_init.go",
    "content": "package payment\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"payment\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/product/product_client.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() productcatalogservice.Client\n\tService() string\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := productcatalogservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient productcatalogservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() productcatalogservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\treturn c.kitexClient.ListProducts(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\treturn c.kitexClient.GetProduct(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\treturn c.kitexClient.SearchProducts(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/product/product_default.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (resp *product.ListProductsResp, err error) {\n\tresp, err = defaultClient.ListProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (resp *product.GetProductResp, err error) {\n\tresp, err = defaultClient.GetProduct(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetProduct call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc SearchProducts(ctx context.Context, req *product.SearchProductsReq, callOptions ...callopt.Option) (resp *product.SearchProductsResp, err error) {\n\tresp, err = defaultClient.SearchProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"SearchProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/product/product_init.go",
    "content": "package product\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"product\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch14/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/Makefile",
    "content": "export ROOT_MOD=github.com/cloudwego/biz-demo/gomall\n.PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl ../../idl/frontend/order_page.proto\n\n.PHONY: gen-user\ngen-user: \n\t@cd rpc_gen && cwgo client --type RPC --service user --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/user.proto\n\t@cd app/user && cwgo server --type RPC --service user --module ${ROOT_MOD}/app/user --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/user.proto\n\n.PHONY: gen-product\ngen-product: \n\t@cd rpc_gen && cwgo client --type RPC --service product --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/product.proto\n\t@cd app/product && cwgo server --type RPC --service product --module ${ROOT_MOD}/app/product --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/product.proto\n\n\n.PHONY: gen-cart\ngen-cart: \n\t@cd rpc_gen && cwgo client --type RPC --service cart --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/cart.proto\n\t@cd app/cart && cwgo server --type RPC --service cart --module ${ROOT_MOD}/app/cart --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/cart.proto\n\n\n.PHONY: gen-checkout\ngen-checkout: \n\t@cd rpc_gen && cwgo client --type RPC --service checkout --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/checkout.proto\n\t@cd app/checkout && cwgo server --type RPC --service checkout --module ${ROOT_MOD}/app/checkout --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/checkout.proto\n\n\n.PHONY: gen-payment\ngen-payment: \n\t@cd rpc_gen && cwgo client --type RPC --service payment --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/payment.proto\n\t@cd app/payment && cwgo server --type RPC --service payment --module ${ROOT_MOD}/app/payment --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/payment.proto\n\n.PHONY: gen-order\ngen-order: \n\t@cd rpc_gen && cwgo client --type RPC --service order --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/order.proto\n\t@cd app/order && cwgo server --type RPC --service order --module ${ROOT_MOD}/app/order --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/order.proto\n\n.PHONY: gen-email\ngen-email: \n\t@cd rpc_gen && cwgo client --type RPC --service email --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/email.proto\n\t@cd app/email && cwgo server --type RPC --service email --module ${ROOT_MOD}/app/email --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/email.proto"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\t//nolint:errcheck\n\t\tDB.AutoMigrate(\n\t\t\t&model.Cart{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/model/cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Cart struct {\n\tBase\n\tUserId    uint32 `json:\"user_id\"`\n\tProductId uint32 `json:\"product_id\"`\n\tQty       uint32 `json:\"qty\"`\n}\n\nfunc (c Cart) TableName() string {\n\treturn \"cart\"\n}\n\nfunc GetCartByUserId(db *gorm.DB, ctx context.Context, userId uint32) (cartList []*Cart, err error) {\n\terr = db.Debug().WithContext(ctx).Model(&Cart{}).Find(&cartList, \"user_id = ?\", userId).Error\n\treturn cartList, err\n}\n\nfunc AddCart(db *gorm.DB, ctx context.Context, c *Cart) error {\n\tvar find Cart\n\terr := db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).First(&find).Error\n\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\treturn err\n\t}\n\tif find.ID != 0 {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).UpdateColumn(\"qty\", gorm.Expr(\"qty+?\", c.Qty)).Error\n\t} else {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Create(c).Error\n\t}\n\treturn err\n}\n\nfunc EmptyCart(db *gorm.DB, ctx context.Context, userId uint32) error {\n\tif userId == 0 {\n\t\treturn errors.New(\"user_is is required\")\n\t}\n\treturn db.WithContext(ctx).Delete(&Cart{}, \"user_id = ?\", userId).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/model/cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/service/add_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype AddItemService struct {\n\tctx context.Context\n} // NewAddItemService new AddItemService\nfunc NewAddItemService(ctx context.Context) *AddItemService {\n\treturn &AddItemService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *AddItemService) Run(req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\t// Finish your business logic.\n\tgetProduct, err := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: req.Item.GetProductId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif getProduct.Product == nil || getProduct.Product.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40004, \"product not exist\")\n\t}\n\n\terr = model.AddCart(mysql.DB, s.ctx, &model.Cart{\n\t\tUserId:    req.UserId,\n\t\tProductId: req.Item.ProductId,\n\t\tQty:       uint32(req.Item.Quantity),\n\t})\n\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\n\treturn &cart.AddItemResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/service/add_item_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestAddItem_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/service/empty_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype EmptyCartService struct {\n\tctx context.Context\n} // NewEmptyCartService new EmptyCartService\nfunc NewEmptyCartService(ctx context.Context) *EmptyCartService {\n\treturn &EmptyCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EmptyCartService) Run(req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\t// Finish your business logic.\n\terr = model.EmptyCart(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn &cart.EmptyCartResp{}, kerrors.NewBizStatusError(50001, \"empty cart error\")\n\t}\n\n\treturn &cart.EmptyCartResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/service/empty_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestEmptyCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetCartService struct {\n\tctx context.Context\n} // NewGetCartService new GetCartService\nfunc NewGetCartService(ctx context.Context) *GetCartService {\n\treturn &GetCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetCartService) Run(req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\t// resp = &cart.Cart{}\n\t// Finish your business logic.\n\tcarts, err := model.GetCartByUserId(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\tvar items []*cart.CartItem\n\tfor _, v := range carts {\n\t\titems = append(items, &cart.CartItem{ProductId: v.ProductId, Quantity: int32(v.Qty)})\n\t}\n\n\treturn &cart.GetCartResp{Cart: &cart.Cart{UserId: req.GetUserId(), Items: items}}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/biz/service/get_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cart\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/cart\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/service\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\n// CartServiceImpl implements the last service interface defined in the IDL.\ntype CartServiceImpl struct{}\n\n// AddItem implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) AddItem(ctx context.Context, req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\tresp, err = service.NewAddItemService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) GetCart(ctx context.Context, req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\tresp, err = service.NewGetCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// EmptyCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) EmptyCart(ctx context.Context, req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = service.NewEmptyCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\tcartutils \"github.com/cloudwego/biz-demo/gomall/app/cart/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tProductClient productcatalogservice.Client\n\tonce          sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitProductClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcartutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: conf.GetConf().Kitex.Service,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcartutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'cart'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\trpc.InitClient()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := cartservice.NewServer(new(CartServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/cart\"\nexec \"$CURDIR/bin/cart\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/script/cart.sql",
    "content": "create table cart\n(\n    id         int auto_increment,\n    user_id    int      not null,\n    product_id int      not null,\n    qty        int      not null,\n    created_at datetime not null default current_timestamp,\n    updated_at datetime not null default current_timestamp on update current_timestamp,\n    constraint cart_pk primary key (id)\n);"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/cart/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\ntype CheckoutService struct {\n\tctx context.Context\n} // NewCheckoutService new CheckoutService\nfunc NewCheckoutService(ctx context.Context) *CheckoutService {\n\treturn &CheckoutService{ctx: ctx}\n}\n\n/*\n\tRun\n\n1. get cart\n2. calculate cart\n3. create order\n4. empty cart\n5. pay\n6. change order result\n7. finish\n*/\nfunc (s *CheckoutService) Run(req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\t// Finish your business logic.\n\t// Idempotent\n\t// get cart\n\tcartResult, err := rpc.CartClient.GetCart(s.ctx, &cart.GetCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\tklog.Error(err)\n\t\terr = fmt.Errorf(\"GetCart.err:%v\", err)\n\t\treturn\n\t}\n\tif cartResult == nil || cartResult.Cart == nil || len(cartResult.Cart.Items) == 0 {\n\t\terr = errors.New(\"cart is empty\")\n\t\treturn\n\t}\n\tvar (\n\t\toi    []*order.OrderItem\n\t\ttotal float32\n\t)\n\tfor _, cartItem := range cartResult.Cart.Items {\n\t\tproductResp, resultErr := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: cartItem.ProductId})\n\t\tif resultErr != nil {\n\t\t\tklog.Error(resultErr)\n\t\t\terr = resultErr\n\t\t\treturn\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\tcost := p.Price * float32(cartItem.Quantity)\n\t\ttotal += cost\n\t\toi = append(oi, &order.OrderItem{\n\t\t\tItem: &cart.CartItem{ProductId: cartItem.ProductId, Quantity: cartItem.Quantity},\n\t\t\tCost: cost,\n\t\t})\n\t}\n\t// create order\n\torderReq := &order.PlaceOrderReq{\n\t\tUserId:       req.UserId,\n\t\tUserCurrency: \"USD\",\n\t\tOrderItems:   oi,\n\t\tEmail:        req.Email,\n\t}\n\tif req.Address != nil {\n\t\taddr := req.Address\n\t\tzipCodeInt, _ := strconv.Atoi(addr.ZipCode)\n\t\torderReq.Address = &order.Address{\n\t\t\tStreetAddress: addr.StreetAddress,\n\t\t\tCity:          addr.City,\n\t\t\tCountry:       addr.Country,\n\t\t\tState:         addr.State,\n\t\t\tZipCode:       int32(zipCodeInt),\n\t\t}\n\t}\n\torderResult, err := rpc.OrderClient.PlaceOrder(s.ctx, orderReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"PlaceOrder.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(\"orderResult\", orderResult)\n\t// empty cart\n\temptyResult, err := rpc.CartClient.EmptyCart(s.ctx, &cart.EmptyCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\terr = fmt.Errorf(\"EmptyCart.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(emptyResult)\n\t// charge\n\tvar orderId string\n\tif orderResult != nil || orderResult.Order != nil {\n\t\torderId = orderResult.Order.OrderId\n\t}\n\tpayReq := &payment.ChargeReq{\n\t\tUserId:  req.UserId,\n\t\tOrderId: orderId,\n\t\tAmount:  total,\n\t\tCreditCard: &payment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CreditCard.CreditCardNumber,\n\t\t\tCreditCardExpirationYear:  req.CreditCard.CreditCardExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.CreditCard.CreditCardExpirationMonth,\n\t\t\tCreditCardCvv:             req.CreditCard.CreditCardCvv,\n\t\t},\n\t}\n\tpaymentResult, err := rpc.PaymentClient.Charge(s.ctx, payReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"Charge.err:%v\", err)\n\t\treturn\n\t}\n\tdata, _ := proto.Marshal(&email.EmailReq{\n\t\tFrom:        \"from@example.com\",\n\t\tTo:          req.Email,\n\t\tContentType: \"text/plain\",\n\t\tSubject:     \"You just created an order in CloudWeGo shop\",\n\t\tContent:     \"You just created an order in CloudWeGo shop\",\n\t})\n\tmsg := &nats.Msg{Subject: \"email\", Data: data}\n\t_ = mq.Nc.PublishMsg(msg)\n\n\tklog.Info(paymentResult)\n\t// change order state\n\tklog.Info(orderResult)\n\n\tresp = &checkout.CheckoutResp{\n\t\tOrderId:       orderId,\n\t\tTransactionId: paymentResult.TransactionId,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/biz/service/checkout_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCheckout_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"checkout\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/checkout\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.31.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/compress v1.17.4 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.7 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=\ngithub.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E=\ngithub.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8=\ngithub.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=\ngithub.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/service\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n)\n\n// CheckoutServiceImpl implements the last service interface defined in the IDL.\ntype CheckoutServiceImpl struct{}\n\n// PlaceOrder implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) PlaceOrder(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Checkout implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) Checkout(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(nats.DefaultURL)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\tcheckoututils \"github.com/cloudwego/biz-demo/gomall/app/checkout/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tCartClient    cartservice.Client\n\tProductClient productcatalogservice.Client\n\tPaymentClient paymentservice.Client\n\tOrderClient   orderservice.Client\n\n\tonce        sync.Once\n\terr         error\n\tserviceName = conf.GetConf().Kitex.Service\n)\n\nvar commonOpts []client.Option\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitCartClient()\n\t\tinitProductClient()\n\t\tinitPaymentClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\t\tCurrentServiceName: serviceName,\n\t\t\tTracerProvider:     mtl.TracerProvider,\n\t\t}),\n\t)\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: serviceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t)\n\topts = append(opts, commonOpts...)\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initPaymentClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: serviceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts, client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}), client.WithTransportProtocol(transport.GRPC), client.WithMetaHandler(transmeta.ClientHTTP2Handler))\n\topts = append(opts, commonOpts...)\n\tPaymentClient, err = paymentservice.NewClient(\"payment\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: serviceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts, client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}), client.WithTransportProtocol(transport.GRPC), client.WithMetaHandler(transmeta.ClientHTTP2Handler))\n\topts = append(opts, commonOpts...)\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'checkout'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\trpc.InitClient()\n\tmq.Init()\n\n\topts := kitexInit()\n\n\tsvr := checkoutservice.NewServer(new(CheckoutServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tklog.SetLevel(conf.LogLevel())\n\tklog.SetOutput(os.Stdout)\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/checkout\"\nexec \"$CURDIR/bin/checkout\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/checkout/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/biz/consumer/consumer.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage consumer\n\nimport \"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer/email\"\n\nfunc Init() {\n\temail.ConsumerInit()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/biz/consumer/email/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/notify\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc ConsumerInit() {\n\t// Connect to a server\n\n\tsub, err := mq.Nc.Subscribe(\"email\", func(m *nats.Msg) {\n\t\tvar req email.EmailReq\n\t\terr := proto.Unmarshal(m.Data, &req)\n\t\tif err != nil {\n\t\t\tklog.Error(err)\n\t\t}\n\t\tnoopEmail := notify.NewNoopEmail()\n\t\t_ = noopEmail.Send(&req)\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tserver.RegisterShutdownHook(func() {\n\t\tsub.Unsubscribe() //nolint:errcheck\n\t\tmq.Nc.Close()\n\t})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/biz/consumer/email/email_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nfunc TestEmailConsumer(t *testing.T) {\n\t// Connect to a server\n\tnc, _ := nats.Connect(nats.DefaultURL)\n\tdefer nc.Close()\n\n\tdata, err := proto.Marshal(&email.EmailReq{\n\t\tFrom:        \"hello@example.com\",\n\t\tTo:          \"to@example.com\",\n\t\tContentType: \"text/plain\",\n\t\tSubject:     \"hello world\",\n\t\tContent:     \"hello world\",\n\t})\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\terr = nc.PublishMsg(&nats.Msg{Subject: \"email\", Data: data})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/biz/service/send.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\ntype SendService struct {\n\tctx context.Context\n} // NewSendService new SendService\nfunc NewSendService(ctx context.Context) *SendService {\n\treturn &SendService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SendService) Run(req *email.EmailReq) (resp *email.EmailResp, err error) {\n\t// Finish your business logic.\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/biz/service/send_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc TestSend_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewSendService(ctx)\n\t// init req and assert value\n\n\treq := &email.EmailReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"email\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/email\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.31.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/compress v1.17.4 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.7 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=\ngithub.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E=\ngithub.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8=\ngithub.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=\ngithub.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/service\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\n// EmailServiceImpl implements the last service interface defined in the IDL.\ntype EmailServiceImpl struct{}\n\n// Send implements the EmailServiceImpl interface.\nfunc (s *EmailServiceImpl) Send(ctx context.Context, req *email.EmailReq) (resp *email.EmailResp, err error) {\n\tresp, err = service.NewSendService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(nats.DefaultURL)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/infra/notify/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage notify\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/kr/pretty\"\n)\n\ntype NoopEmail struct{}\n\nfunc (e *NoopEmail) Send(req *email.EmailReq) error {\n\tpretty.Printf(\"%v\\n\", req)\n\treturn nil\n}\n\nfunc NewNoopEmail() NoopEmail {\n\treturn NoopEmail{}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'email'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tmq.Init()\n\tconsumer.Init()\n\tsvr := emailservice.NewServer(new(EmailServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/email/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/email\"\nexec \"$CURDIR/bin/email\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(resp))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect := \"/\"\n\n\tc.Redirect(consts.StatusFound, []byte(redirect))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/cart/cart_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// AddCartItem .\n// @router /cart [POST]\nfunc AddCartItem(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req cart.AddCartReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\t_, err = service.NewAddCartItemService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(\"/cart\"))\n}\n\n// GetCart .\n// @router /cart [GET]\nfunc GetCart(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetCartService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/cart/cart_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestAddCartItem(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/cart\", AddCartItem)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestGetCart(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/cart\", GetCart)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/category/category_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Category .\n// @router /category/:category [GET]\nfunc Category(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req category.CategoryReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewCategoryService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"category\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/category/category_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCategory(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/category/:category\", Category)\n\tpath := \"/category/:category\"                             // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/checkout/checkout_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Checkout .\n// @router /checkout [GET]\nfunc Checkout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutWaiting .\n// @router /checkout/waiting [POST]\nfunc CheckoutWaiting(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutWaitingService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutResult .\n// @router /checkout/result [GET]\nfunc CheckoutResult(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutResultService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"result\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/checkout/checkout_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCheckout(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout\", Checkout)\n\tpath := \"/checkout\"                                       // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutWaiting(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/checkout/waiting\", CheckoutWaiting)\n\tpath := \"/checkout/waiting\"                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutResult(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout/result\", CheckoutResult)\n\tpath := \"/checkout/result\"                                // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t// resp, err :=\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/order/order_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// OrderList .\n// @router /order [GET]\nfunc OrderList(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewOrderListService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"order\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"order\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/order/order_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestOrderList(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/order\", OrderList)\n\tpath := \"/order\"                                          // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/product/product_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetProduct .\n// @router /product [GET]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.ProductReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetProductService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"product\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/handler/product/product_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetProduct(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/product\", GetProduct)\n\tpath := \"/product\"                                        // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/cart/cart_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.POST(\"/cart\", append(_addcartitemMw(), cart.AddCartItem)...)\n\troot.GET(\"/cart\", append(_getcartMw(), cart.GetCart)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/cart/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage cart\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n\n}\n\nfunc _addcartitemMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getcartMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/category/category_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage category\n\nimport (\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/category\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_category := root.Group(\"/category\", _categoryMw()...)\n\t\t_category.GET(\"/:category\", append(_category0Mw(), category.Category)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/category/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage category\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _categoryMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _category0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/checkout/checkout_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/checkout\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/checkout\", append(_checkout0Mw(), checkout.Checkout)...)\n\t_checkout := root.Group(\"/checkout\", _checkoutMw()...)\n\t_checkout.GET(\"/result\", append(_checkoutresultMw(), checkout.CheckoutResult)...)\n\t_checkout.POST(\"/waiting\", append(_checkoutwaitingMw(), checkout.CheckoutWaiting)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/checkout/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage checkout\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkout0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutresultMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutwaitingMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/order/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage order\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _orderlistMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/order/order_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage order\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/order\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/order\", append(_orderlistMw(), order.OrderList)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/product/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage product\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getproductMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/product/product_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage product\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/product\", append(_getproductMw(), product.GetProduct)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/cart\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/category\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/checkout\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/order\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\torder.Register(r)\n\n\tcheckout.Register(r)\n\n\tcart.Register(r)\n\n\tproduct.Register(r)\n\n\tcategory.Register(r)\n\n\tauth.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/add_cart_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype AddCartItemService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewAddCartItemService(Context context.Context, RequestContext *app.RequestContext) *AddCartItemService {\n\treturn &AddCartItemService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *AddCartItemService) Run(req *cart.AddCartReq) (resp *common.Empty, err error) {\n\t_, err = rpc.CartClient.AddItem(h.Context, &rpccart.AddItemReq{\n\t\tUserId: frontendutils.GetUserIdFromCtx(h.Context),\n\t\tItem: &rpccart.CartItem{\n\t\t\tProductId: req.ProductId,\n\t\t\tQuantity:  req.ProductNum,\n\t\t},\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CategoryService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCategoryService(Context context.Context, RequestContext *app.RequestContext) *CategoryService {\n\treturn &CategoryService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CategoryService) Run(req *category.CategoryReq) (resp map[string]any, err error) {\n\tp, _ := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{CategoryName: req.Category})\n\treturn utils.H{\n\t\t\"title\":    \"Category\",\n\t\t\"items\":    p.Products,\n\t\t\"cart_num\": 10,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutService(Context context.Context, RequestContext *app.RequestContext) *CheckoutService {\n\treturn &CheckoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.ProductId})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":    p.Name,\n\t\t\t\"Price\":   strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\": p.Picture,\n\t\t\t\"Qty\":     strconv.Itoa(int(v.Quantity)),\n\t\t})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"Checkout\",\n\t\t\"items\":    items,\n\t\t\"cart_num\": len(items),\n\t\t\"total\":    strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/checkout_result.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype CheckoutResultService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutResultService(Context context.Context, RequestContext *app.RequestContext) *CheckoutResultService {\n\treturn &CheckoutResultService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutResultService) Run(req *common.Empty) (resp map[string]any, err error) {\n\treturn utils.H{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/checkout_waiting.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\trpcpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutWaitingService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutWaitingService(Context context.Context, RequestContext *app.RequestContext) *CheckoutWaitingService {\n\treturn &CheckoutWaitingService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutWaitingService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\t_, err = rpc.CheckoutClient.Checkout(h.Context, &rpccheckout.CheckoutReq{\n\t\tUserId:    userId,\n\t\tEmail:     req.Email,\n\t\tFirstname: req.Firstname,\n\t\tLastname:  req.Lastname,\n\t\tAddress: &rpccheckout.Address{\n\t\t\tCountry:       req.Country,\n\t\t\tZipCode:       req.Zipcode,\n\t\t\tCity:          req.City,\n\t\t\tState:         req.Province,\n\t\t\tStreetAddress: req.Street,\n\t\t},\n\t\tCreditCard: &rpcpayment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CardNum,\n\t\t\tCreditCardExpirationYear:  req.ExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.ExpirationMonth,\n\t\t\tCreditCardCvv:             req.Cvv,\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"waiting\",\n\t\t\"redirect\": \"/checkout/result\",\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetCartService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetCartService(Context context.Context, RequestContext *app.RequestContext) *GetCartService {\n\treturn &GetCartService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetCartService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{\n\t\tUserId: uint32(h.Context.Value(frontendutils.UserIdKey).(float64)),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.GetProductId()})\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\"Name\": p.Name, \"Description\": p.Description, \"Picture\": p.Picture, \"Price\": strconv.FormatFloat(float64(p.Price), 'f', 2, 64), \"Qty\": strconv.Itoa(int(v.Quantity))})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Cart\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetProductService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetProductService(Context context.Context, RequestContext *app.RequestContext) *GetProductService {\n\treturn &GetProductService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetProductService) Run(req *product.ProductReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: req.GetId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"item\": p.Product,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (res map[string]any, err error) {\n\tctx := h.Context\n\tp, err := rpc.ProductClient.ListProducts(ctx, &product.ListProductsReq{})\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n\tvar cartNum int\n\treturn utils.H{\n\t\t\"title\":    \"Hot sale\",\n\t\t\"cart_num\": cartNum,\n\t\t\"items\":    p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (resp string, err error) {\n\tres, err := rpc.UserClient.Login(h.Context, &rpcuser.LoginReq{Email: req.Email, Password: req.Password})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\tfrontendutils.MustHandleError(err)\n\tredirect := \"/\"\n\tif frontendutils.ValidateNext(req.Next) {\n\t\tredirect = req.Next\n\t}\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn redirect, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\tsession.Save() //nolint:errcheck\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/order_list.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/types\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcorder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype OrderListService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewOrderListService(Context context.Context, RequestContext *app.RequestContext) *OrderListService {\n\treturn &OrderListService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *OrderListService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\tvar orders []*types.Order\n\tlistOrderResp, err := rpc.OrderClient.ListOrder(h.Context, &rpcorder.ListOrderReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif listOrderResp == nil || len(listOrderResp.Orders) == 0 {\n\t\treturn utils.H{\n\t\t\t\"title\":  \"Order\",\n\t\t\t\"orders\": orders,\n\t\t}, nil\n\t}\n\n\tfor _, v := range listOrderResp.Orders {\n\t\tvar items []types.OrderItem\n\t\tvar total float32\n\t\tif len(v.OrderItems) > 0 {\n\t\t\tfor _, vv := range v.OrderItems {\n\t\t\t\ttotal += vv.Cost\n\t\t\t\ti := vv.Item\n\t\t\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: i.ProductId})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif productResp.Product == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tp := productResp.Product\n\t\t\t\titems = append(items, types.OrderItem{\n\t\t\t\t\tProductId:   i.ProductId,\n\t\t\t\t\tQty:         uint32(i.Quantity),\n\t\t\t\t\tProductName: p.Name,\n\t\t\t\t\tPicture:     p.Picture,\n\t\t\t\t\tCost:        vv.Cost,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\ttimeObj := time.Unix(int64(v.CreatedAt), 0)\n\t\torders = append(orders, &types.Order{\n\t\t\tCost:        total,\n\t\t\tItems:       items,\n\t\t\tCreatedDate: timeObj.Format(\"2006-01-02 15:04:05\"),\n\t\t\tOrderId:     v.OrderId,\n\t\t\tConsignee:   types.Consignee{Email: v.Email},\n\t\t})\n\t}\n\n\treturn utils.H{\n\t\t\"title\":  \"Order\",\n\t\t\"orders\": orders,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\tres, err := rpc.UserClient.Register(h.Context, &rpcuser.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tConfirmPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tvar cartNum int\n\tuserId := frontendutils.GetUserIdFromCtx(ctx)\n\tcartResp, _ := rpc.CartClient.GetCart(ctx, &cart.GetCartReq{UserId: userId})\n\tif cartResp != nil && cartResp.Cart != nil {\n\t\tcartNum = len(cartResp.Cart.Items)\n\t}\n\tcontent[\"user_id\"] = ctx.Value(frontendutils.UserIdKey)\n\tcontent[\"cart_num\"] = cartNum\n\treturn content\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     int    `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.7.3\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/hashicorp/consul/api v1.26.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b\n\tgithub.com/hertz-contrib/logger/zap v1.1.0\n\tgithub.com/hertz-contrib/monitor-prometheus v0.1.2\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3\n\tgithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1\n\tgithub.com/hertz-contrib/pprof v0.1.1\n\tgithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/prometheus/client_golang v1.19.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.opentelemetry.io/otel v1.25.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0\n\tgo.opentelemetry.io/otel/sdk v1.25.0\n\tgo.opentelemetry.io/otel/trace v1.25.0\n\tgo.uber.org/zap v1.27.0\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/andeya/ameda v1.5.3 // indirect\n\tgithub.com/andeya/goutil v1.0.1 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.11 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.7.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.3.0 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/andeya/ameda v1.5.3 h1:SvqnhQPZwwabS8HQTRGfJwWPl2w9ZIPInHAw9aE1Wlk=\ngithub.com/andeya/ameda v1.5.3/go.mod h1:FQDHRe1I995v6GG+8aJ7UIUToEmbdTJn/U26NCPIgXQ=\ngithub.com/andeya/goutil v1.0.1 h1:eiYwVyAnnK0dXU5FJsNjExkJW4exUGn/xefPt3k4eXg=\ngithub.com/andeya/goutil v1.0.1/go.mod h1:jEG5/QnnhG7yGxwFUX6Q+JGMif7sjdHmmNVjn7nhJDo=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11 h1:jJgmoDKPKacGl0llPYbYL/+/2N+Ng0vV0ipbnVssXHY=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11/go.mod h1:UAyKh4ZRLBPGsyTRFZoPqTni1TlojMdOJXQnEIPCX84=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.3.5/go.mod h1:V973WhNhGmvHxW6nQmsHEfHaoU9F3zTF+93rH03hcUQ=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.3.2/go.mod h1:hnv3B7eZ6kMv7CKFHT2OC4LU0mA4s5XPyu/SbixLcrU=\ngithub.com/cloudwego/hertz v0.6.0/go.mod h1:83EedHQvCXpveYh2r9us8YlQ1C28vPg93wPdB/QpJiA=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.6/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=\ngithub.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.15.0/go.mod h1:bcaw5CSZ7NE9qfOfKCI1xb7ZKjzu/MyvQkCLTfqLqxQ=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.10.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b h1:RoBp+TurP+46VZl31VMV+6wO2SlNlXwyVwjc93s5/tI=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/zap v1.1.0 h1:4efINiIDJrXEtAFeEdDJvc3Hye0VFxp+0X4BwaZgxNs=\ngithub.com/hertz-contrib/logger/zap v1.1.0/go.mod h1:D/rJJgsYn+SGaHVfVqWS3vHTbbc7ODAlJO+6smWgTeE=\ngithub.com/hertz-contrib/monitor-prometheus v0.1.2 h1:MYZGi4uStLtHKUm7+kc/ljbxzUTDE9H5FPCTSB/p7ZM=\ngithub.com/hertz-contrib/monitor-prometheus v0.1.2/go.mod h1:aUP6t5bK8msuf+5dN/k8099IjD0u8s9A6vrYWQ+yzN0=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1 h1:N/rbPCZgrupBNjTEe8Cq+cnTOpgj/y4SU6MYe6uQl0g=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1/go.mod h1:oEnsG4CpBuLx1vcCnxpE/MsNHUrF4qQKw8DiOdtdBa0=\ngithub.com/hertz-contrib/pprof v0.1.1 h1:x7kOFUtqkveXbDbiISIFE3x02cAtcb6/DBjHgsJmYcM=\ngithub.com/hertz-contrib/pprof v0.1.1/go.mod h1:9g23VQrcC4AjW++VA2relquyMXPVfs/s+t5FBIjIIOs=\ngithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b h1:DIfogbZyBmOYUkkS0jGDNT03jqVPtHypQrZ0mhcASUE=\ngithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b/go.mod h1:bjNZ+0osz/GmRMEXZAMeme+qE7WV6g4DEtX/TdfXzvo=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/nyaruka/phonenumbers v1.3.0 h1:IFyyJfF2Elg8xGKFghWrRXzb6qAHk+Q3uPqmIgS20JQ=\ngithub.com/nyaruka/phonenumbers v1.3.0/go.mod h1:4jyKp/BFUokLbCHyoZag+T3S1KezFVoEKtgnbpzItC4=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50732,\n\t\tName:          \"api.service_path\",\n\t\tTag:           \"bytes,50732,opt,name=service_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is\n\t// generated, with a higher priority than api_version\n\t//\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the\n\t// client code is generated\n\t//\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n\t// optional string service_path = 50732;\n\tE_ServicePath = &file_api_proto_extTypes[37]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[38]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x47, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xac, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a,\n\t0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t3,  // 37: api.service_path:extendee -> google.protobuf.ServiceOptions\n\t4,  // 38: api.reserve:extendee -> google.protobuf.MessageOptions\n\t39, // [39:39] is the sub-list for method output_type\n\t39, // [39:39] is the sub-list for method input_type\n\t39, // [39:39] is the sub-list for extension type_name\n\t0,  // [0:39] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 39,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\" form:\"confirm_password\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52,\n\t0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a,\n\t0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb, 0x18, 0x10, 0x63, 0x6f, 0x6e,\n\t0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x73,\n\t0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2,\n\t0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x04, 0x6e,\n\t0x65, 0x78, 0x74, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12,\n\t0x1a, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e,\n\t0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x22, 0x12, 0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72,\n\t0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x12, 0x17, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0f, 0xd2, 0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x4b,\n\t0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: frontend.auth.RegisterReq\n\t(*LoginReq)(nil),     // 1: frontend.auth.LoginReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t1, // 1: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/hertz_gen/frontend/cart/cart_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: cart_page.proto\n\npackage cart\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AddCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId  uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\" form:\"productId\"`\n\tProductNum int32  `protobuf:\"varint,2,opt,name=product_num,json=productNum,proto3\" json:\"product_num,omitempty\" form:\"productNum\"`\n}\n\nfunc (x *AddCartReq) Reset() {\n\t*x = AddCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddCartReq) ProtoMessage() {}\n\nfunc (x *AddCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddCartReq.ProtoReflect.Descriptor instead.\nfunc (*AddCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AddCartReq) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *AddCartReq) GetProductNum() int32 {\n\tif x != nil {\n\t\treturn x.ProductNum\n\t}\n\treturn 0\n}\n\nvar File_cart_page_proto protoreflect.FileDescriptor\n\nvar file_cart_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x6b, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71,\n\t0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x42, 0x0d, 0xe2, 0xbb, 0x18, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x49, 0x64, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x2f,\n\t0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x05, 0x42, 0x0e, 0xe2, 0xbb, 0x18, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x4e, 0x75, 0x6d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x32,\n\t0xa0, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x4b, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x19,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x09, 0xd2, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,\n\t0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x09, 0xca, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61,\n\t0x72, 0x74, 0x42, 0x4b, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64,\n\t0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_page_proto_rawDescOnce sync.Once\n\tfile_cart_page_proto_rawDescData = file_cart_page_proto_rawDesc\n)\n\nfunc file_cart_page_proto_rawDescGZIP() []byte {\n\tfile_cart_page_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_page_proto_rawDescData)\n\t})\n\treturn file_cart_page_proto_rawDescData\n}\n\nvar file_cart_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_cart_page_proto_goTypes = []interface{}{\n\t(*AddCartReq)(nil),   // 0: frontend.cart.AddCartReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_cart_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.cart.CartService.AddCartItem:input_type -> frontend.cart.AddCartReq\n\t1, // 1: frontend.cart.CartService.GetCart:input_type -> frontend.common.Empty\n\t1, // 2: frontend.cart.CartService.AddCartItem:output_type -> frontend.common.Empty\n\t1, // 3: frontend.cart.CartService.GetCart:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_page_proto_init() }\nfunc file_cart_page_proto_init() {\n\tif File_cart_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_page_proto_goTypes,\n\t\tDependencyIndexes: file_cart_page_proto_depIdxs,\n\t\tMessageInfos:      file_cart_page_proto_msgTypes,\n\t}.Build()\n\tFile_cart_page_proto = out.File\n\tfile_cart_page_proto_rawDesc = nil\n\tfile_cart_page_proto_goTypes = nil\n\tfile_cart_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/hertz_gen/frontend/category/category_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: category_page.proto\n\npackage category\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CategoryReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory string `protobuf:\"bytes,1,opt,name=category,proto3\" json:\"category,omitempty\" path:\"category\"`\n}\n\nfunc (x *CategoryReq) Reset() {\n\t*x = CategoryReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_category_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryReq) ProtoMessage() {}\n\nfunc (x *CategoryReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_category_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryReq.ProtoReflect.Descriptor instead.\nfunc (*CategoryReq) Descriptor() ([]byte, []int) {\n\treturn file_category_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CategoryReq) GetCategory() string {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn \"\"\n}\n\nvar File_category_page_proto protoreflect.FileDescriptor\n\nvar file_category_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x08, 0x63, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xd2, 0xbb, 0x18,\n\t0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x32, 0x6e, 0x0a, 0x0f, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13,\n\t0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2f, 0x3a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x42, 0x4f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d,\n\t0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_category_page_proto_rawDescOnce sync.Once\n\tfile_category_page_proto_rawDescData = file_category_page_proto_rawDesc\n)\n\nfunc file_category_page_proto_rawDescGZIP() []byte {\n\tfile_category_page_proto_rawDescOnce.Do(func() {\n\t\tfile_category_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_category_page_proto_rawDescData)\n\t})\n\treturn file_category_page_proto_rawDescData\n}\n\nvar file_category_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_category_page_proto_goTypes = []interface{}{\n\t(*CategoryReq)(nil),  // 0: frontend.category.CategoryReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_category_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.category.CategoryService.Category:input_type -> frontend.category.CategoryReq\n\t1, // 1: frontend.category.CategoryService.Category:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_category_page_proto_init() }\nfunc file_category_page_proto_init() {\n\tif File_category_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_category_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_category_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_category_page_proto_goTypes,\n\t\tDependencyIndexes: file_category_page_proto_depIdxs,\n\t\tMessageInfos:      file_category_page_proto_msgTypes,\n\t}.Build()\n\tFile_category_page_proto = out.File\n\tfile_category_page_proto_rawDesc = nil\n\tfile_category_page_proto_goTypes = nil\n\tfile_category_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/hertz_gen/frontend/checkout/checkout_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: checkout_page.proto\n\npackage checkout\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tFirstname       string `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\" form:\"firstname\"`\n\tLastname        string `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\" form:\"lastname\"`\n\tStreet          string `protobuf:\"bytes,4,opt,name=street,proto3\" json:\"street,omitempty\" form:\"street\"`\n\tZipcode         string `protobuf:\"bytes,5,opt,name=zipcode,proto3\" json:\"zipcode,omitempty\" form:\"zipcode\"`\n\tProvince        string `protobuf:\"bytes,6,opt,name=province,proto3\" json:\"province,omitempty\" form:\"province\"`\n\tCountry         string `protobuf:\"bytes,7,opt,name=country,proto3\" json:\"country,omitempty\" form:\"country\"`\n\tCity            string `protobuf:\"bytes,8,opt,name=city,proto3\" json:\"city,omitempty\" form:\"city\"`\n\tCardNum         string `protobuf:\"bytes,9,opt,name=card_num,json=cardNum,proto3\" json:\"card_num,omitempty\" form:\"cardNum\"`\n\tExpirationMonth int32  `protobuf:\"varint,10,opt,name=expiration_month,json=expirationMonth,proto3\" json:\"expiration_month,omitempty\" form:\"expirationMonth\"`\n\tExpirationYear  int32  `protobuf:\"varint,11,opt,name=expiration_year,json=expirationYear,proto3\" json:\"expiration_year,omitempty\" form:\"expirationYear\"`\n\tCvv             int32  `protobuf:\"varint,12,opt,name=cvv,proto3\" json:\"cvv,omitempty\" form:\"cvv\"`\n\tPayment         string `protobuf:\"bytes,13,opt,name=payment,proto3\" json:\"payment,omitempty\" form:\"payment\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetStreet() string {\n\tif x != nil {\n\t\treturn x.Street\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetZipcode() string {\n\tif x != nil {\n\t\treturn x.Zipcode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCardNum() string {\n\tif x != nil {\n\t\treturn x.CardNum\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationMonth\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetCvv() int32 {\n\tif x != nil {\n\t\treturn x.Cvv\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetPayment() string {\n\tif x != nil {\n\t\treturn x.Payment\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_page_proto protoreflect.FileDescriptor\n\nvar file_checkout_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa6, 0x04, 0x0a, 0x0b, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d,\n\t0xe2, 0xbb, 0x18, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x0a, 0xe2, 0xbb, 0x18, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x52, 0x06,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x7a, 0x69, 0x70,\n\t0x63, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a,\n\t0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70,\n\t0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x63, 0x6f,\n\t0x75, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c,\n\t0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xe2, 0xbb,\n\t0x18, 0x04, 0x63, 0x69, 0x74, 0x79, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x08,\n\t0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b,\n\t0xe2, 0xbb, 0x18, 0x07, 0x63, 0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x52, 0x07, 0x63, 0x61, 0x72,\n\t0x64, 0x4e, 0x75, 0x6d, 0x12, 0x3e, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13,\n\t0xe2, 0xbb, 0x18, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f,\n\t0x6e, 0x74, 0x68, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x6f, 0x6e, 0x74, 0x68, 0x12, 0x3b, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, 0xe2,\n\t0xbb, 0x18, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x12, 0x19, 0x0a, 0x03, 0x63, 0x76, 0x76, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xe2, 0xbb, 0x18, 0x03, 0x63, 0x76, 0x76, 0x52, 0x03, 0x63, 0x76, 0x76, 0x12, 0x25, 0x0a, 0x07,\n\t0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2,\n\t0xbb, 0x18, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x32, 0x96, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x6f, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0d, 0xca, 0xc1, 0x18,\n\t0x09, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x58, 0x0a, 0x0f, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,\n\t0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0xd2,\n\t0xc1, 0x18, 0x11, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x77, 0x61, 0x69,\n\t0x74, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0xca, 0xc1, 0x18, 0x10, 0x2f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x4f, 0x5a, 0x4d,\n\t0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64,\n\t0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f,\n\t0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_page_proto_rawDescOnce sync.Once\n\tfile_checkout_page_proto_rawDescData = file_checkout_page_proto_rawDesc\n)\n\nfunc file_checkout_page_proto_rawDescGZIP() []byte {\n\tfile_checkout_page_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_page_proto_rawDescData)\n\t})\n\treturn file_checkout_page_proto_rawDescData\n}\n\nvar file_checkout_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_checkout_page_proto_goTypes = []interface{}{\n\t(*CheckoutReq)(nil),  // 0: frontend.checkout.CheckoutReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_checkout_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.checkout.CheckoutService.Checkout:input_type -> frontend.checkout.CheckoutReq\n\t1, // 1: frontend.checkout.CheckoutService.CheckoutWaiting:input_type -> frontend.common.Empty\n\t1, // 2: frontend.checkout.CheckoutService.CheckoutResult:input_type -> frontend.common.Empty\n\t1, // 3: frontend.checkout.CheckoutService.Checkout:output_type -> frontend.common.Empty\n\t1, // 4: frontend.checkout.CheckoutService.CheckoutWaiting:output_type -> frontend.common.Empty\n\t1, // 5: frontend.checkout.CheckoutService.CheckoutResult:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_page_proto_init() }\nfunc file_checkout_page_proto_init() {\n\tif File_checkout_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_page_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_page_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_page_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_page_proto = out.File\n\tfile_checkout_page_proto_rawDesc = nil\n\tfile_checkout_page_proto_goTypes = nil\n\tfile_checkout_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x09, 0x61,\n\t0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,\n\t0x4c, 0x0a, 0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d,\n\t0x0a, 0x04, 0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a,\n\t0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.common.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.common.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/hertz_gen/frontend/order/order_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: order_page.proto\n\npackage order\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_order_page_proto protoreflect.FileDescriptor\n\nvar file_order_page_proto_rawDesc = []byte{\n\t0x0a, 0x10, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x32, 0x57, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x73,\n\t0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0a, 0xca, 0xc1, 0x18, 0x06, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x4c, 0x5a,\n\t0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar file_order_page_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_order_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.order.OrderService.OrderList:input_type -> frontend.common.Empty\n\t0, // 1: frontend.order.OrderService.OrderList:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_order_page_proto_init() }\nfunc file_order_page_proto_init() {\n\tif File_order_page_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_page_proto_goTypes,\n\t\tDependencyIndexes: file_order_page_proto_depIdxs,\n\t}.Build()\n\tFile_order_page_proto = out.File\n\tfile_order_page_proto_rawDesc = nil\n\tfile_order_page_proto_goTypes = nil\n\tfile_order_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/hertz_gen/frontend/product/product_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: product_page.proto\n\npackage product\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\" query:\"id\"`\n}\n\nfunc (x *ProductReq) Reset() {\n\t*x = ProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProductReq) ProtoMessage() {}\n\nfunc (x *ProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProductReq.ProtoReflect.Descriptor instead.\nfunc (*ProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nvar File_product_page_proto protoreflect.FileDescriptor\n\nvar file_product_page_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61,\n\t0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x42, 0x06, 0xb2, 0xbb, 0x18, 0x02, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x32, 0x62,\n\t0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x50, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x22, 0x0c, 0xca, 0xc1, 0x18, 0x08, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64,\n\t0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_page_proto_rawDescOnce sync.Once\n\tfile_product_page_proto_rawDescData = file_product_page_proto_rawDesc\n)\n\nfunc file_product_page_proto_rawDescGZIP() []byte {\n\tfile_product_page_proto_rawDescOnce.Do(func() {\n\t\tfile_product_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_page_proto_rawDescData)\n\t})\n\treturn file_product_page_proto_rawDescData\n}\n\nvar file_product_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_product_page_proto_goTypes = []interface{}{\n\t(*ProductReq)(nil),   // 0: frontend.product.ProductReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_product_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.product.ProductService.GetProduct:input_type -> frontend.product.ProductReq\n\t1, // 1: frontend.product.ProductService.GetProduct:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_product_page_proto_init() }\nfunc file_product_page_proto_init() {\n\tif File_product_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_page_proto_goTypes,\n\t\tDependencyIndexes: file_product_page_proto_depIdxs,\n\t\tMessageInfos:      file_product_page_proto_msgTypes,\n\t}.Build()\n\tFile_product_page_proto = out.File\n\tfile_product_page_proto_rawDesc = nil\n\tfile_product_page_proto_goTypes = nil\n\tfile_product_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/infra/mtl/log.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/kitex/server\"\n\thertzzap \"github.com/hertz-contrib/logger/zap\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\"\n)\n\nfunc initLog() {\n\tvar opts []hertzzap.Option\n\tvar output zapcore.WriteSyncer\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\topts = append(opts, hertzzap.WithCoreEnc(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())))\n\t\toutput = os.Stdout\n\t} else {\n\t\topts = append(opts, hertzzap.WithCoreEnc(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())))\n\t\t// async log\n\t\toutput = &zapcore.BufferedWriteSyncer{\n\t\t\tWS:            zapcore.AddSync(os.Stdout),\n\t\t\tFlushInterval: time.Minute,\n\t\t}\n\t\tserver.RegisterShutdownHook(func() {\n\t\t\toutput.Sync() //nolint:errcheck\n\t\t})\n\t}\n\tlog := hertzzap.NewLogger(opts...)\n\thlog.SetLogger(log)\n\thlog.SetLevel(hlog.LevelInfo)\n\thlog.SetOutput(output)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/infra/mtl/metric.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server/registry\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/route\"\n\tconsulapi \"github.com/hashicorp/consul/api\"\n\t\"github.com/hertz-contrib/registry/consul\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/collectors\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n)\n\nvar Registry *prometheus.Registry\n\nfunc initMetric() route.CtxCallback {\n\tRegistry = prometheus.NewRegistry()\n\tRegistry.MustRegister(collectors.NewGoCollector())\n\tRegistry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))\n\tconfig := consulapi.DefaultConfig()\n\tconfig.Address = conf.GetConf().Hertz.RegistryAddr\n\tconsulClient, _ := consulapi.NewClient(config)\n\tr := consul.NewConsulRegister(consulClient, consul.WithAdditionInfo(&consul.AdditionInfo{\n\t\tTags: []string{\"service:frontend\"},\n\t}))\n\n\tlocalIp := utils.LocalIP()\n\tip, err := net.ResolveTCPAddr(\"tcp\", fmt.Sprintf(\"%s:%d\", localIp, conf.GetConf().Hertz.MetricsPort))\n\tif err != nil {\n\t\thlog.Error(err)\n\t}\n\tregistryInfo := &registry.Info{Addr: ip, ServiceName: \"prometheus\", Weight: 1}\n\terr = r.Register(registryInfo)\n\n\tif err != nil {\n\t\thlog.Error(err)\n\t}\n\n\thttp.Handle(\"/metrics\", promhttp.HandlerFor(Registry, promhttp.HandlerOpts{}))\n\tgo http.ListenAndServe(fmt.Sprintf(\":%d\", conf.GetConf().Hertz.MetricsPort), nil) //nolint:errcheck\n\treturn func(ctx context.Context) {\n\t\tr.Deregister(registryInfo) //nolint:errcheck\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/infra/mtl/mtl.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/route\"\n)\n\nvar once sync.Once\n\nvar Hooks []route.CtxCallback\n\nfunc InitMtl() {\n\tonce.Do(\n\t\tfunc() {\n\t\t\tHooks = append(Hooks, InitTracing(), initMetric())\n\t\t\tinitLog()\n\t\t},\n\t)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/infra/mtl/tracing.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/route\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.17.0\"\n)\n\nvar TracerProvider *tracesdk.TracerProvider\n\nfunc InitTracing() route.CtxCallback {\n\texporter, err := otlptracegrpc.New(context.Background())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tprocessor := tracesdk.NewBatchSpanProcessor(exporter)\n\tres, err := resource.New(context.Background(), resource.WithAttributes(semconv.ServiceNameKey.String(utils.ServiceName)))\n\tif err != nil {\n\t\tres = resource.Default()\n\t}\n\tTracerProvider = tracesdk.NewTracerProvider(tracesdk.WithSpanProcessor(processor), tracesdk.WithResource(res))\n\totel.SetTracerProvider(TracerProvider)\n\n\treturn route.CtxCallback(func(ctx context.Context) {\n\t\texporter.Shutdown(ctx) //nolint:errcheck\n\t})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/mtl\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/circuitbreak\"\n\t\"github.com/cloudwego/kitex/pkg/fallback\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tUserClient     userservice.Client\n\tProductClient  productcatalogservice.Client\n\tCartClient     cartservice.Client\n\tCheckoutClient checkoutservice.Client\n\tOrderClient    orderservice.Client\n\n\tonce sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitUserClient()\n\t\tinitProductClient()\n\t\tinitCartClient()\n\t\tinitCheckoutClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initUserClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\tUserClient, err = userservice.NewClient(\"user\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\tcbs := circuitbreak.NewCBSuite(func(ri rpcinfo.RPCInfo) string {\n\t\treturn circuitbreak.RPCInfo2Key(ri)\n\t})\n\n\tcbs.UpdateServiceCBConfig(\"shop-frontend/product/GetProduct\", circuitbreak.CBConfig{Enable: true, ErrRate: 0.5, MinSample: 2})\n\n\topts = append(opts, client.WithCircuitBreaker(cbs), client.WithFallback(fallback.NewFallbackPolicy(fallback.UnwrapHelper(func(ctx context.Context, req, resp interface{}, err error) (fbResp interface{}, fbErr error) {\n\t\tmethodName := rpcinfo.GetRPCInfo(ctx).To().Method()\n\t\tif err == nil {\n\t\t\treturn resp, err\n\t\t}\n\t\tif methodName != \"ListProducts\" {\n\t\t\treturn resp, err\n\t\t}\n\t\treturn &product.ListProductsResp{\n\t\t\tProducts: []*product.Product{\n\t\t\t\t{\n\t\t\t\t\tPrice:       6.6,\n\t\t\t\t\tId:          3,\n\t\t\t\t\tPicture:     \"/static/image/t-shirt.jpeg\",\n\t\t\t\t\tName:        \"T-Shirt\",\n\t\t\t\t\tDescription: \"CloudWeGo T-Shirt\",\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil\n\t}))))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t)\n\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCheckoutClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t)\n\tCheckoutClient, err = checkoutservice.NewClient(\"checkout\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t)\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzprom \"github.com/hertz-contrib/monitor-prometheus\"\n\thertzotelprovider \"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\thertzoteltracing \"github.com/hertz-contrib/obs-opentelemetry/tracing\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n\toteltrace \"go.opentelemetry.io/otel/trace\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMtl()\n\trpc.InitClient()\n\n\taddress := conf.GetConf().Hertz.Address\n\n\t_ = hertzotelprovider.NewOpenTelemetryProvider(\n\t\thertzotelprovider.WithSdkTracerProvider(mtl.TracerProvider),\n\t\thertzotelprovider.WithEnableMetrics(false),\n\t)\n\n\ttracer, cfg := hertzoteltracing.NewServerTracer(hertzoteltracing.WithCustomResponseHandler(func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Header(\"shop-trace-id\", oteltrace.SpanFromContext(ctx).SpanContext().TraceID().String())\n\t}))\n\n\th := server.New(server.WithHostPorts(address), server.WithTracer(hertzprom.NewServerTracer(\n\t\t\"\",\n\t\t\"\",\n\t\thertzprom.WithRegistry(mtl.Registry),\n\t\thertzprom.WithDisableServer(true),\n\t)), tracer)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Delims(\"{{\", \"}}\")\n\th.Use(hertzoteltracing.ServerMiddleware(cfg))\n\n\tregisterMiddleware(h)\n\n\trouter.GeneratedRegister(h)\n\n\th.GET(\"sign-in\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-in\", utils.H{\n\t\t\t\"title\": \"Sign in\",\n\t\t\t\"next\":  c.Query(\"next\"),\n\t\t})\n\t})\n\th.GET(\"sign-up\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", utils.H{\n\t\t\t\"title\": \"Sign up\",\n\t\t})\n\t})\n\n\th.Static(\"/static\", \"./\")\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\tstore, err := redis.NewStore(100, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tstore.Options(sessions.Options{MaxAge: 86400, Path: \"/\"})\n\trs, err := redis.GetRedisStore(store)\n\tif err == nil {\n\t\trs.SetSerializer(sessions.JSONSerializer{})\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\th.OnShutdown = append(h.OnShutdown, mtl.Hooks...)\n\n\t// cores\n\th.Use(cors.Default())\n\tmiddleware.RegisterMiddleware(h)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tbyteRef := c.GetHeader(\"Referer\")\n\t\t\tref := string(byteRef)\n\t\t\tnext := \"/sign-in\"\n\t\t\tif ref != \"\" {\n\t\t\t\tif utils.ValidateNext(ref) {\n\t\t\t\t\tnext = fmt.Sprintf(\"%s?next=%s\", next, ref)\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.Redirect(302, []byte(next))\n\t\t\tc.Abort()\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc RegisterMiddleware(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/cart-num.tmpl",
    "content": "{{define \"cart-num\"}}\n    <a href=\"/cart\" class=\"btn position-relative\">\n        <i class=\"fa-solid fa-cart-shopping\" style=\"font-size: 2rem\">\n        </i>\n        {{ if $.cart_num}}\n        <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\">\n    {{ $.cart_num }}\n            {{ end }}\n  </span>\n    </a>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/cart.tmpl",
    "content": "{{ define \"cart\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <ul class=\"list-group\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n        {{ if $.items }}\n            <div class=\"mt-3 mb-5\">\n                <div class=\"float-end\">\n                    <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                    <a href=\"/checkout\" class=\"btn btn-lg btn-success float-end\">Check out</a>\n                </div>\n            </div>\n        {{else}}\n            <h1 class=\"text-center text-danger\">Your Cart is empty</h1>\n            <div class=\"text-center\"><a href=\"/\">Shop Hot Sale</a></div>\n        {{ end }}\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/category.tmpl",
    "content": "{{ define \"category\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/checkout.tmpl",
    "content": "{{ define \"checkout\" }}\n    {{ template \"header\" . }}\n    <div class=\"row mb-5\">\n        <div class=\"col-lg-8 col-sm-12\">\n            <form method=\"post\" action=\"/checkout/waiting\">\n                <h4 class=\"mb-3 mt-3\">Contact</h4>\n                <label for=\"email\" class=\"form-label col-12\">\n                    <input class=\"form-control\" id=\"email\" type=\"email\" placeholder=\"Email\" name=\"email\"\n                           aria-label=\"email\" value=\"abc@example.com\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">Delivery</h4>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"firstname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"firstname\" class=\"form-control\" placeholder=\"First name\"\n                               name=\"firstname\" value=\"world\">\n                    </label>\n                    <label for=\"lastname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"lastname\" class=\"form-control\" placeholder=\"Last name\" name=\"lastname\"\n                               value=\"hello\">\n                    </label>\n                </div>\n                <label for=\"street\" class=\"mb-3 mt-3 col-12 form-label\">\n                    <input type=\"text\" class=\"form-control\" placeholder=\"Street\" name=\"street\" value=\"7th street\"\n                           id=\"street\">\n                </label>\n                <label for=\"zipcode\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"zipcode\" name=\"zipcode\" placeholder=\"zipcode\"\n                           value=\"310000\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"city\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"city\" class=\"form-control\" placeholder=\"City\" name=\"city\"\n                               value=\"hangzhou\">\n                    </label>\n                    <label for=\"province\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"province\" class=\"form-control\" name=\"province\" placeholder=\"Province\"\n                               value=\"zhejiang\">\n                    </label>\n                </div>\n                <label for=\"country\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"country\" name=\"country\" placeholder=\"Country\"\n                           value=\"china\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">\n                    Payment\n                </h4>\n                <label for=\"card-num\" class=\"form-label col-12\">\n                    <input type=\"text\" id=\"card-num\" class=\"form-control\" name=\"cardNum\" placeholder=\"Card number\"\n                           value=\"424242424242424242\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"expiration-month\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-month\" name=\"expirationMonth\" class=\"form-control\"\n                               placeholder=\"Expiration Month\" value=\"12\">\n                    </label>\n                    <label for=\"expiration-year\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-year\" name=\"expirationYear\" class=\"form-control\"\n                               placeholder=\"Expiration Year\" value=\"2030\">\n                    </label>\n                    <label for=\"cvv\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"cvv\" class=\"form-control\" name=\"cvv\" placeholder=\"cvv\" required>\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"card\" value=\"card\" checked>\n                    <label class=\"form-check-label\" for=\"card\">\n                        Card\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"stripe\" value=\"stripe\" disabled>\n                    <label class=\"form-check-label\" for=\"stripe\">\n                        Stripe\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"paypal\" value=\"paypal\" disabled>\n                    <label class=\"form-check-label\" for=\"paypal\">\n                        Paypal\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"wechat\" value=\"wechat\" disabled>\n                    <label class=\"form-check-label\" for=\"wechat\">\n                        Wechat\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"alipay\" value=\"alipay\" disabled>\n                    <label class=\"form-check-label\" for=\"alipay\">\n                        Alipay\n                    </label>\n                </div>\n                <div class=\"mt-3 mb-3\">\n                    <div class=\"float-end\">\n                        <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                        <input type=\"submit\" class=\"btn btn-success\" value=\"Pay\">\n                    </div>\n                </div>\n            </form>\n        </div>\n        <ul class=\"list-group col-lg-4 col-sm-12\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/footer.tmpl",
    "content": "{{ define \"footer\" }}\n\n    </div>\n    </main>\n    <footer class=\"py-5 bg-primary text-white\">\n        <div class=\"footer-top\">\n            <div class=\"container footer-social\">\n                <p>© 2023 CloudWeGo (<a class=\"text-white\"\n                                        href=\"https://github.com/cloudwego\">Source Code</a>)</p>\n            </div>\n        </div>\n    </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/js/all.min.js\"\n            integrity=\"sha512-GWzVrcGlo0TxTRvz9ttioyYJ+Wwk9Ck0G81D+eO63BaqHaJ3YZX9wuqjwgfcV/MrB2PhaVX9DkYVhbFpStnqpQ==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    </body>\n    </html>\n{{ end }}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/header.tmpl",
    "content": "{{ define \"header\" }}\n    <!DOCTYPE html>\n    <html lang=\"en\">\n\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, shrink-to-fit=no\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n        {{ if $.redirect }}\n            <meta http-equiv=\"refresh\" content=\"5;url=/checkout/result\"/>\n        {{ end}}\n        <title>\n            CloudWeGo Shop\n        </title>\n        <link rel=\"stylesheet\" href=\"/static/css/bootstrap.min.css\">\n        <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n              integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n              crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n    </head>\n\n    <body class=\"min-vh-100\">\n    <header>\n        <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n            <div class=\"container\">\n                <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\"\n                        data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"/\">\n                    <img src=\"/static/image/logo.jpg\" style=\"height: 50px\" alt=\"\"> CloudWego Shop\n                </a>\n                <div class=\" ms-lg-3 d-block d-lg-none d-xl-none\">\n                    {{ template \"cart-num\" . }}\n                </div>\n                <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                    <ul class=\"navbar-nav mb-2 mb-lg-0 w-100\">\n                        <li class=\"nav-item dropdown\">\n                            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\"\n                               aria-expanded=\"false\">\n                                Categories\n                            </a>\n                            <ul class=\"dropdown-menu\">\n                                <li><a class=\"dropdown-item\" href=\"/category/t-shirt\">T-shirt</a></li>\n                                <li><a class=\"dropdown-item\" href=\"/category/sticker\">Sticker</a></li>\n                            </ul>\n                        </li>\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link\" href=\"/about\">About</a>\n                        </li>\n                        <form class=\"d-flex ms-auto\" role=\"search\" action=\"/search\" method=\"get\">\n                            <input class=\"form-control me-2\" type=\"search\" name=\"q\" placeholder=\"Search\"\n                                   aria-label=\"Search\" value=\"{{ .q }}\">\n                            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n                        </form>\n                        {{ if .user_id }}\n                            <div class=\"nav-item dropdown ms-3\">\n                                <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\"\n                                   aria-expanded=\"false\"><i class=\"fa-solid fa-user me-2\"></i>Hello</a>\n                                <ul class=\"dropdown-menu\">\n                                    <li><a class=\"dropdown-item\" href=\"/order\">Order Center</a></li>\n                                    <li>\n                                        <hr class=\"dropdown-divider\">\n                                    </li>\n                                    <li>\n                                        <form class=\"d-flex ms-auto\" action=\"/auth/logout\" method=\"post\">\n                                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                                        </form>\n                                    </li>\n                                </ul>\n                            </div>\n                        {{ else }}\n                            <div class=\"btn-group ms-3\" role=\"group\" aria-label=\"Basic mixed styles example\">\n                                <a href=\"/sign-in\" class=\"btn btn-primary\">Sign in</a>\n                            </div>\n                        {{ end }}\n                    </ul>\n                </div>\n                <div class=\"ms-lg-3 d-none d-lg-block d-xl-block\">\n                    {{ template \"cart-num\" . }}\n                </div>\n\n            </div>\n        </nav>\n        <div class=\"bg-primary text-center text-white pt-1 pb-1\">This website is hosted for demo purposes only. It is\n            not an\n            actual shop.\n        </div>\n        {{ if .error }}\n            <div class=\"alert alert-danger text-center\" role=\"alert\">{{ .error }}</div>\n         {{ end }}\n        {{ if .warning }}\n            <div class=\"alert alert-warning text-center\" role=\"alert\">{{ .warning }}</div>\n        {{ end }}\n    </header>\n    <main role=\"main\" class=\"home pt-5\" style=\"min-height:calc(100vh - 212px);\">\n        <div class=\"container\">\n            <h1 class=\"text-center\">{{ $.title }}</h1>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/home.tmpl",
    "content": "{{ define \"home\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items }}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/order.tmpl",
    "content": "{{ define \"order\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n                    <div class=\"card-body row\">\n                        {{ range $.orders }}\n                        <div class=\"card\">\n                            <div class=\"card-body\">\n                              <h6 class=\"card-subtitle mb-2 text-muted\">{{.CreatedDate}} Order ID: {{.OrderId}}</h6>\n                              <ul class=\"list-group col-lg-12 col-sm-15\">\n                                {{ range .Items }}\n                                    <li class=\"list-group-item border-0\">\n                                        <div class=\"card border-0\">\n                                            <div class=\"card-body row\">\n                                                <div class=\"col-3\">\n                                                    <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                                                </div>\n                                                <div class=\"col-3\">\n                                                    <div class=\"mt-1\">{{ .ProductName }}</div>\n                                                </div>\n                                                <div class=\"col-2\">\n                                                    <div class=\"mt-1\">x {{ .Qty }}</div>\n                                                </div>\n                                                <div class=\"col-4\">\n                                                    <div class=\"mt-1\">Cost: {{ .Cost }}</div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </li>\n                                {{ end}}\n                            </ul>\n                            </div>\n                        </div>\n                        <p>\n                        {{ end}}\n                    </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/product.tmpl",
    "content": "{{ define \"product\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div id=\"productPicture\" class=\"carousel slide col-lg-6 col-sm-12\">\n                    <div class=\"carousel-indicators\">\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"0\"\n                                class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"1\"\n                                aria-label=\"Slide 2\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"2\"\n                                aria-label=\"Slide 3\"></button>\n                    </div>\n                    <div class=\"carousel-inner\">\n                        <div class=\"carousel-item active\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                    </div>\n                    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"prev\">\n                        <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Previous</span>\n                    </button>\n                    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"next\">\n                        <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Next</span>\n                    </button>\n                </div>\n                <div class=\"col-lg-1\"></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-center\">\n                    <form action=\"/cart\" method=\"post\">\n                        <h5 class=\"card-title\">{{ .item.Name }}</h5>\n                        <p class=\"card-text\">{{ .item.Description }}</p>\n                        <p class=\"card-text\">${{ .item.Price }}</p>\n                        <input type=\"hidden\" value=\"{{ .item.Id }}\" name=\"productId\">\n                        <label for=\"productNum\">数量：</label>\n                        <input type=\"number\" class=\"form-control mt-3\" id=\"productNum\" name=\"productNum\" value=\"1\"\n                               min=\"1\"/>\n                        <input type=\"submit\" class=\"btn btn-primary mt-3\" value=\"Add to Cart\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/result.tmpl",
    "content": "{{ define \"result\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <i class=\"fa-regular fa-circle-check fs-1 text-success\"></i>\n        <div class=\"text-center fs-3\">\n            Congratulations, you have successfully placed an order.\n        </div>\n    </div>\n    <div class=\"d-flex justify-content-center\">\n        <a href=\"/order\" class=\"btn btn-info\">Check Order</a>\n        <a href=\"/\" class=\"btn btn-success ms-5\">Back to Home</a>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/search.tmpl",
    "content": "{{ define \"search\" }}\n    {{ template \"header\" . }}\n    {{ if .q }}\n        <div class=\"d-inline-block border border-success rounded-4 p-1 ps-4 pe-4\">\n            <div>\n                {{ .q }}\n                <a href=\"/category\" class=\"ps-4\">\n                    <button type=\"button\" class=\"btn btn-sm btn-danger\" aria-label=\"Close\">X</button>\n                </a>\n            </div>\n        </div>\n    {{ end}}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/sign-in.tmpl",
    "content": "{{ define \"sign-in\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/login{{ if .next }}?next={{.next}} {{ end}}\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" required>\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\" required>\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign up</a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign in</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/sign-up.tmpl",
    "content": "{{ define \"sign-up\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" aria-describedby=\"emailHelp\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password-confirm\" class=\"form-label\">Password confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password-confirm\" name=\"password-confirm\">\n            </div>\n            <div class=\"mb-3\">\n                Already have account, click here to <a href=\"/sign-in\">Sign in</a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign up</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/utils.tmpl",
    "content": "{{ define \"required\" }}\n    <span class=\"text-danger\">*</span>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/template/waiting.tmpl",
    "content": "{{ define \"waiting\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <div class=\"text-danger h3 text-center mb-5\">\n            Wait a minutes, please don't close the window\n        </div>\n        <div class=\"spinner-grow text-primary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-secondary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-success\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-danger\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-warning\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-info\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-light\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-dark\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/types/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage types\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype Order struct {\n\tConsignee   Consignee\n\tOrderId     string\n\tCreatedDate string\n\tOrderState  string\n\tCost        float32\n\tItems       []OrderItem\n}\n\ntype OrderItem struct {\n\tProductId   uint32\n\tProductName string\n\tPicture     string\n\tQty         uint32\n\tCost        float32\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"frontend\"\n\ntype SessionUserIdKey string\n\nconst UserIdKey = SessionUserIdKey(\"user_id\")\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) uint32 {\n\tif ctx.Value(UserIdKey) == nil {\n\t\treturn 0\n\t}\n\treturn uint32(ctx.Value(UserIdKey).(float64))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/utils/response.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/utils/safe.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"net/url\"\n\nvar validHost = []string{\n\t\"localhost:8080\",\n}\n\nfunc ValidateNext(next string) bool {\n\turlObj, err := url.Parse(next)\n\tif err != nil {\n\t\treturn false\n\t}\n\tif InArray(urlObj.Host, validHost) {\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/frontend/utils/strings.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nfunc InArray[T int | int32 | int64 | float32 | float64 | string](needle T, haystack []T) bool {\n\tfor _, k := range haystack {\n\t\tif needle == k {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Order{},\n\t\t\t&model.OrderItem{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/model/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype Order struct {\n\tBase\n\tOrderId      string `gorm:\"uniqueIndex;size:256\"`\n\tUserId       uint32\n\tUserCurrency string\n\tConsignee    Consignee   `gorm:\"embedded\"`\n\tOrderItems   []OrderItem `gorm:\"foreignKey:OrderIdRefer;references:OrderId\"`\n}\n\nfunc (o Order) TableName() string {\n\treturn \"order\"\n}\n\nfunc ListOrder(db *gorm.DB, ctx context.Context, userId uint32) (orders []Order, err error) {\n\terr = db.Debug().Model(&Order{}).Where(&Order{UserId: userId}).Preload(\"OrderItems\").Find(&orders).Error\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/model/order_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\ntype OrderItem struct {\n\tBase\n\tProductId    uint32\n\tOrderIdRefer string `gorm:\"size:256;index\"`\n\tQuantity     int32\n\tCost         float32\n}\n\nfunc (oi OrderItem) TableName() string {\n\treturn \"order_item\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/service/list_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype ListOrderService struct {\n\tctx context.Context\n} // NewListOrderService new ListOrderService\nfunc NewListOrderService(ctx context.Context) *ListOrderService {\n\treturn &ListOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListOrderService) Run(req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\t// Finish your business logic.\n\torders, err := model.ListOrder(mysql.DB, s.ctx, req.UserId)\n\tif err != nil {\n\t\tklog.Errorf(\"model.ListOrder.err:%v\", err)\n\t\treturn nil, err\n\t}\n\tvar list []*order.Order\n\tfor _, v := range orders {\n\t\tvar items []*order.OrderItem\n\t\tfor _, v := range v.OrderItems {\n\t\t\titems = append(items, &order.OrderItem{\n\t\t\t\tCost: v.Cost,\n\t\t\t\tItem: &cart.CartItem{\n\t\t\t\t\tProductId: v.ProductId,\n\t\t\t\t\tQuantity:  v.Quantity,\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\to := &order.Order{\n\t\t\tOrderId:      v.OrderId,\n\t\t\tUserId:       v.UserId,\n\t\t\tUserCurrency: v.UserCurrency,\n\t\t\tEmail:        v.Consignee.Email,\n\t\t\tCreatedAt:    int32(v.CreatedAt.Unix()),\n\t\t\tAddress: &order.Address{\n\t\t\t\tCountry:       v.Consignee.Country,\n\t\t\t\tCity:          v.Consignee.City,\n\t\t\t\tStreetAddress: v.Consignee.StreetAddress,\n\t\t\t\tZipCode:       v.Consignee.ZipCode,\n\t\t\t},\n\t\t\tOrderItems: items,\n\t\t}\n\t\tlist = append(list, o)\n\t}\n\tresp = &order.ListOrderResp{\n\t\tOrders: list,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/service/list_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/service/place_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype PlaceOrderService struct {\n\tctx context.Context\n} // NewPlaceOrderService new PlaceOrderService\nfunc NewPlaceOrderService(ctx context.Context) *PlaceOrderService {\n\treturn &PlaceOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *PlaceOrderService) Run(req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\t// Finish your business logic.\n\tif len(req.OrderItems) == 0 {\n\t\terr = fmt.Errorf(\"OrderItems empty\")\n\t\treturn\n\t}\n\n\terr = mysql.DB.Transaction(func(tx *gorm.DB) error {\n\t\torderId, _ := uuid.NewUUID()\n\n\t\to := &model.Order{\n\t\t\tOrderId:      orderId.String(),\n\t\t\tUserId:       req.UserId,\n\t\t\tUserCurrency: req.UserCurrency,\n\t\t\tConsignee: model.Consignee{\n\t\t\t\tEmail: req.Email,\n\t\t\t},\n\t\t}\n\t\tif req.Address != nil {\n\t\t\ta := req.Address\n\t\t\to.Consignee.Country = a.Country\n\t\t\to.Consignee.State = a.State\n\t\t\to.Consignee.City = a.City\n\t\t\to.Consignee.StreetAddress = a.StreetAddress\n\t\t}\n\t\tif err := tx.Create(o).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvar itemList []*model.OrderItem\n\t\tfor _, v := range req.OrderItems {\n\t\t\titemList = append(itemList, &model.OrderItem{\n\t\t\t\tOrderIdRefer: o.OrderId,\n\t\t\t\tProductId:    v.Item.ProductId,\n\t\t\t\tQuantity:     v.Item.Quantity,\n\t\t\t\tCost:         v.Cost,\n\t\t\t})\n\t\t}\n\t\tif err := tx.Create(&itemList).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp = &order.PlaceOrderResp{\n\t\t\tOrder: &order.OrderResult{\n\t\t\t\tOrderId: orderId.String(),\n\t\t\t},\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/biz/service/place_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestPlaceOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"order\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/order\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/service\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n)\n\n// OrderServiceImpl implements the last service interface defined in the IDL.\ntype OrderServiceImpl struct{}\n\n// PlaceOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) PlaceOrder(ctx context.Context, req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = service.NewPlaceOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// ListOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) ListOrder(ctx context.Context, req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\tresp, err = service.NewListOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'order'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := orderservice.NewServer(new(OrderServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/order/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/order\"\nexec \"$CURDIR/bin/order\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\ntmp\n\n.env\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.PaymentLog{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/biz/model/payment.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype PaymentLog struct {\n\tBase\n\tUserId        uint32    `json:\"user_id\"`\n\tOrderId       string    `json:\"order_id\"`\n\tTransactionId string    `json:\"transaction_id\"`\n\tAmount        float32   `json:\"amount\"`\n\tPayAt         time.Time `json:\"pay_at\"`\n}\n\nfunc (p PaymentLog) TableName() string {\n\treturn \"payment\"\n}\n\nfunc CreatePaymentLog(db *gorm.DB, ctx context.Context, payment *PaymentLog) error {\n\treturn db.WithContext(ctx).Model(&PaymentLog{}).Create(payment).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/biz/service/charge.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\tcreditcard \"github.com/durango/go-credit-card\"\n\t\"github.com/google/uuid\"\n)\n\ntype ChargeService struct {\n\tctx context.Context\n} // NewChargeService new ChargeService\nfunc NewChargeService(ctx context.Context) *ChargeService {\n\treturn &ChargeService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ChargeService) Run(req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tcard := creditcard.Card{\n\t\tNumber: req.CreditCard.CreditCardNumber,\n\t\tCvv:    strconv.Itoa(int(req.CreditCard.CreditCardCvv)),\n\t\tMonth:  strconv.Itoa(int(req.CreditCard.CreditCardExpirationMonth)),\n\t\tYear:   strconv.Itoa(int(req.CreditCard.CreditCardExpirationYear)),\n\t}\n\n\terr = card.Validate(true)\n\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(400, err.Error())\n\t}\n\n\ttranslationId, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = model.CreatePaymentLog(mysql.DB, s.ctx, &model.PaymentLog{\n\t\tUserId:        req.UserId,\n\t\tOrderId:       req.OrderId,\n\t\tTransactionId: translationId.String(),\n\t\tAmount:        req.Amount,\n\t\tPayAt:         time.Now(),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &payment.ChargeResp{TransactionId: translationId.String()}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/biz/service/charge_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCharge_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"payment\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/payment\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082 h1:3RgcPZrUWhrxqhtDkuRmDTRVXGkxrVMZtJMic7cEtGA=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082/go.mod h1:jKPLGXGRR3v90kZOLs/kUMffoEot8IrRDGmmzI3kOtg=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/service\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n)\n\n// PaymentServiceImpl implements the last service interface defined in the IDL.\ntype PaymentServiceImpl struct{}\n\n// Charge implements the PaymentServiceImpl interface.\nfunc (s *PaymentServiceImpl) Charge(ctx context.Context, req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tresp, err = service.NewChargeService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'payment'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/middleware\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := paymentservice.NewServer(new(PaymentServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMiddleware(middleware.ServerMiddleware),\n\t)\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/middleware/mw.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/pkg/endpoint\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n)\n\nfunc ServerMiddleware(next endpoint.Endpoint) endpoint.Endpoint {\n\treturn func(ctx context.Context, req, resp interface{}) (err error) {\n\t\tri := rpcinfo.GetRPCInfo(ctx)\n\t\t// get client serviceName\n\t\tklog.Infof(\"client serviceName: %v\\n\", ri.From().ServiceName())\n\t\tif err := next(ctx, req, resp); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/payment.sql",
    "content": "create table payment\n(\n    id             int auto_increment,\n    user_id        int            not null,\n    order_id       varchar(100)   not null,\n    transaction_id varchar(100)   not null,\n    amount         decimal(10, 2) not null,\n    pay_at         datetime       not null,\n    created_at     datetime       not null default current_timestamp,\n    updated_at     datetime       not null default current_timestamp on update current_timestamp,\n    constraint payment_pk primary key (id)\n);"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/payment\"\nexec \"$CURDIR/bin/payment\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/payment/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n.env"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.Product{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Product{},\n\t\t\t&model.Category{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `product`.`category` VALUES (1,'2023-12-06 15:05:06','2023-12-06 15:05:06','T-Shirt','T-Shirt'),(2,'2023-12-06 15:05:06','2023-12-06 15:05:06','Sticker','Sticker')\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product` VALUES ( 1, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Notebook', 'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ', '/static/image/notebook.jpeg', 9.90 ), ( 2, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Mouse-Pad', 'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ', '/static/image/mouse-pad.jpeg', 8.80 ), ( 3, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt.jpeg', 6.60 ), ( 4, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-1.jpeg', 2.20 ), ( 5, '2023-12-06 15:26:19', '2023-12-09 22:32:35', 'Sweatshirt', 'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.', '/static/image/sweatshirt.jpeg', 1.10 ), ( 6, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-2.jpeg', 1.80 ), ( 7, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'mascot', 'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.', '/static/image/logo.jpg', 4.80 )\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product_category` (product_id,category_id) VALUES ( 1, 2 ), ( 2, 2 ), ( 3, 1 ), ( 4, 1 ), ( 5, 1 ), ( 6, 1 ),( 7, 2 )\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/redis/go-redis/extra/redisotel/v9\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n\tredisotel.InstrumentTracing(RedisClient) //nolint:errcheck\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/model/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Category struct {\n\tBase\n\tName        string    `json:\"name\"`\n\tDescription string    `json:\"description\"`\n\tProducts    []Product `json:\"product\" gorm:\"many2many:product_category\"`\n}\n\nfunc (c Category) TableName() string {\n\treturn \"category\"\n}\n\nfunc GetProductsByCategoryName(db *gorm.DB, ctx context.Context, name string) (category []Category, err error) {\n\terr = db.WithContext(ctx).Model(&Category{}).Where(&Category{Name: name}).Preload(\"Products\").Find(&category).Error\n\treturn category, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/model/product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tBase\n\tName        string     `json:\"name\"`\n\tDescription string     `json:\"description\"`\n\tPicture     string     `json:\"picture\"`\n\tPrice       float32    `json:\"price\"`\n\tCategories  []Category `json:\"categories\" gorm:\"many2many:product_category\"`\n}\n\nfunc (p Product) TableName() string {\n\treturn \"product\"\n}\n\ntype ProductQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (p ProductQuery) GetById(productId int) (product Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn\n}\n\nfunc NewProductQuery(ctx context.Context, db *gorm.DB) ProductQuery {\n\treturn ProductQuery{ctx: ctx, db: db}\n}\n\ntype CachedProductQuery struct {\n\tproductQuery ProductQuery\n\tcacheClient  *redis.Client\n\tprefix       string\n}\n\nfunc (c CachedProductQuery) GetById(productId int) (product Product, err error) {\n\tcacheKey := fmt.Sprintf(\"%s_%s_%d\", c.prefix, \"product_by_id\", productId)\n\tcachedResult := c.cacheClient.Get(c.productQuery.ctx, cacheKey)\n\n\terr = func() error {\n\t\terr1 := cachedResult.Err()\n\t\tif err1 != nil {\n\t\t\treturn err1\n\t\t}\n\t\tcachedResultByte, err2 := cachedResult.Bytes()\n\t\tif err2 != nil {\n\t\t\treturn err2\n\t\t}\n\t\terr3 := json.Unmarshal(cachedResultByte, &product)\n\t\tif err3 != nil {\n\t\t\treturn err3\n\t\t}\n\t\treturn nil\n\t}()\n\n\tif err != nil {\n\t\tproduct, err = c.productQuery.GetById(productId)\n\t\tif err != nil {\n\t\t\treturn Product{}, err\n\t\t}\n\t\tencoded, err := json.Marshal(product)\n\t\tif err != nil {\n\t\t\treturn product, nil\n\t\t}\n\t\t_ = c.cacheClient.Set(c.productQuery.ctx, cacheKey, encoded, time.Hour)\n\t}\n\treturn\n}\n\nfunc NewCachedProductQuery(pq ProductQuery, cacheClient *redis.Client) CachedProductQuery {\n\treturn CachedProductQuery{productQuery: pq, cacheClient: cacheClient, prefix: \"cloudwego_shop\"}\n}\n\nfunc GetProductById(db *gorm.DB, ctx context.Context, productId int) (product Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn product, err\n}\n\nfunc SearchProduct(db *gorm.DB, ctx context.Context, q string) (product []*Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Find(&product, \"name like ? or description like ?\", \"%\"+q+\"%\", \"%\"+q+\"%\").Error\n\treturn product, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetProductService struct {\n\tctx context.Context\n} // NewGetProductService new GetProductService\nfunc NewGetProductService(ctx context.Context) *GetProductService {\n\treturn &GetProductService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetProductService) Run(req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\t// Finish your business logic.\n\tif req.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40000, \"product id is required\")\n\t}\n\n\tp, err := model.NewCachedProductQuery(model.NewProductQuery(s.ctx, mysql.DB), redis.RedisClient).GetById(int(req.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &product.GetProductResp{\n\t\tProduct: &product.Product{\n\t\t\tId:          uint32(p.ID),\n\t\t\tPicture:     p.Picture,\n\t\t\tPrice:       p.Price,\n\t\t\tDescription: p.Description,\n\t\t\tName:        p.Name,\n\t\t},\n\t}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/service/get_product_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetProduct_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewGetProductService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.GetProductRequest{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/service/list_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype ListProductsService struct {\n\tctx context.Context\n} // NewListProductsService new ListProductsService\nfunc NewListProductsService(ctx context.Context) *ListProductsService {\n\treturn &ListProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListProductsService) Run(req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\t// Finish your business logic.\n\tc, err := model.GetProductsByCategoryName(mysql.DB, s.ctx, req.CategoryName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &product.ListProductsResp{}\n\tfor _, v1 := range c {\n\t\tfor _, v := range v1.Products {\n\t\t\tresp.Products = append(resp.Products, &product.Product{Id: uint32(v.ID), Name: v.Name, Description: v.Description, Picture: v.Picture, Price: v.Price})\n\t\t}\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/service/list_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewListProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.ListProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype SearchProductsService struct {\n\tctx context.Context\n} // NewSearchProductsService new SearchProductsService\nfunc NewSearchProductsService(ctx context.Context) *SearchProductsService {\n\treturn &SearchProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SearchProductsService) Run(req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\t// Finish your business logic.\n\tp, err := model.SearchProduct(mysql.DB, s.ctx, req.Query)\n\tvar results []*product.Product\n\tfor _, v := range p {\n\t\tresults = append(results, &product.Product{\n\t\t\tId:          uint32(v.ID),\n\t\t\tName:        v.Name,\n\t\t\tDescription: v.Description,\n\t\t\tPicture:     v.Picture,\n\t\t\tPrice:       v.Price,\n\t\t})\n\t}\n\treturn &product.SearchProductsResp{Results: results}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/biz/service/search_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestSearchProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewSearchProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.SearchProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"product\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n\t// Centralized Config Server\n\tConfigServer ConfigServer `yaml:\"configServer\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\ntype ConfigServer struct{}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/product\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.18.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ=\ngithub.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/service\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\n// ProductCatalogServiceImpl implements the last service interface defined in the IDL.\ntype ProductCatalogServiceImpl struct{}\n\n// ListProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) ListProducts(ctx context.Context, req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\tresp, err = service.NewListProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetProduct implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) GetProduct(ctx context.Context, req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tresp, err = service.NewGetProductService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// SearchProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) SearchProducts(ctx context.Context, req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\tresp, err = service.NewSearchProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'product'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := productcatalogservice.NewServer(new(ProductCatalogServiceImpl), opts...)\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\topts = append(opts,\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/product\"\nexec \"$CURDIR/bin/product\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/script/product.sql",
    "content": "CREATE TABLE `category`\n(\n    `id`          int          NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)  NOT NULL,\n    `description` varchar(255) NOT NULL,\n    `created_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `category`\nVALUES (1, 'Clothes', 'Clothes', '2023-12-06 15:05:06', '2023-12-06 15:05:06'),\n       (2, 'Other', 'Other', '2023-12-06 15:05:06', '2023-12-06 15:05:06');\nCREATE TABLE `product`\n(\n    `id`          int            NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)    NOT NULL,\n    `description` varchar(255)   NOT NULL,\n    `picture`     varchar(255)   NOT NULL,\n    `price`       decimal(10, 2) NOT NULL,\n    `created_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product`\nVALUES (1, 'Notebook',\n        'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ',\n        '/static/image/notebook.jpeg', 9.90, '2023-12-06 15:26:19', '2023-12-09 22:29:10'),\n       (2, 'Mouse-Pad',\n        'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ',\n        '/static/image/mouse-pad.jpeg', 8.80, '2023-12-06 15:26:19', '2023-12-09 22:29:59'),\n       (3, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt.jpeg', 6.60, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (4, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-1.jpeg', 2.20, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (5, 'Sweatshirt',\n        'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.',\n        '/static/image/sweatshirt.jpeg', 1.10, '2023-12-06 15:26:19', '2023-12-09 22:32:35'),\n       (6, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-2.jpeg', 1.80, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (10, 'mascot',\n        'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.',\n        '/static/image/logo.jpg', 4.80, '2023-12-06 15:26:19', '2023-12-09 22:39:47');\nCREATE TABLE `product_category`\n(\n    `id`          int      NOT NULL AUTO_INCREMENT,\n    `product_id`  int      NOT NULL,\n    `category_id` int      NOT NULL,\n    `created_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product_category`\nVALUES (1, 1, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (2, 2, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (3, 3, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (4, 4, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (5, 5, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (6, 6, 1, '2023-12-06 15:27:30', '2023-12-09 22:41:47'),\n       (10, 10, 2, '2023-12-06 15:27:30', '2023-12-06 15:27:30');"
  },
  {
    "path": "gomall/tutorial/ch15/app/product/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"shop-product\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.User{})\n\t\terr := DB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.User{},\n\t\t)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `user` (`id`,`created_at`,`updated_at`,`email`,`password_hashed`) VALUES (1,'2023-12-26 09:46:19.852','2023-12-26 09:46:19.852','123@admin.com','$2a$10$jTvUFh7Z8Kw0hLV8WrAws.PRQTeuH4gopJ7ZMoiFvwhhz5Vw.bj7C')\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"time\"\n)\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tBase\n\tEmail          string `gorm:\"unique\"`\n\tPasswordHashed string\n}\n\nfunc (u User) TableName() string {\n\treturn \"user\"\n}\n\nfunc GetByEmail(db *gorm.DB, ctx context.Context, email string) (user *User, err error) {\n\terr = db.WithContext(ctx).Model(&User{}).Where(&User{Email: email}).First(&user).Error\n\treturn\n}\n\nfunc Create(db *gorm.DB, ctx context.Context, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tklog.Infof(\"LoginReq:%+v\", req)\n\tuserRow, err := model.GetByEmail(mysql.DB, s.ctx, req.Email)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(userRow.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn\n\t}\n\treturn &user.LoginResp{UserId: int32(userRow.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewLoginService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.LoginReq{\n\t// \tEmail:    \"1111@qq.com\",\n\t// \tPassword: \"123\",\n\t// }\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Password != req.ConfirmPassword {\n\t\terr = errors.New(\"Password must be the same as ConfirmPassword\")\n\t\treturn\n\t}\n\thashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(hashedPassword),\n\t}\n\tif err = model.Create(mysql.DB, s.ctx, newUser); err != nil {\n\t\treturn\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewRegisterService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.RegisterReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\topts = append(opts, server.WithSuite(tracing.NewServerSuite()))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch15/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/common/clientsuite/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage clientsuite\n\nimport (\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\t\"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n)\n\ntype CommonGrpcClientSuite struct {\n\tDestServiceName    string\n\tDestServiceAddr    string\n\tCurrentServiceName string\n\tTracerProvider     *tracesdk.TracerProvider\n}\n\nfunc (s CommonGrpcClientSuite) Options() []client.Option {\n\topts := []client.Option{\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t}\n\n\t_ = provider.NewOpenTelemetryProvider(provider.WithSdkTracerProvider(s.TracerProvider), provider.WithEnableMetrics(false))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\t\tServiceName: s.CurrentServiceName,\n\t\t}),\n\t\tclient.WithSuite(tracing.NewClientSuite()),\n\t)\n\n\treturn opts\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/common/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/common\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire (\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/prometheus/client_golang v1.18.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.21.0\n\tgo.uber.org/zap v1.26.0\n)\n\nrequire (\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n"
  },
  {
    "path": "gomall/tutorial/ch15/common/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch15/common/mtl/log.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexzap \"github.com/kitex-contrib/obs-opentelemetry/logging/zap\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\"\n)\n\nfunc InitLog() {\n\tvar opts []kitexzap.Option\n\tvar output zapcore.WriteSyncer\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\topts = append(opts, kitexzap.WithCoreEnc(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())))\n\t\toutput = os.Stdout\n\t} else {\n\t\topts = append(opts, kitexzap.WithCoreEnc(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())))\n\t\t// async log\n\t\toutput = &zapcore.BufferedWriteSyncer{\n\t\t\tWS:            zapcore.AddSync(os.Stdout),\n\t\t\tFlushInterval: time.Minute,\n\t\t}\n\t\tserver.RegisterShutdownHook(func() {\n\t\t\toutput.Sync() //nolint:errcheck\n\t\t})\n\t}\n\tlog := kitexzap.NewLogger(opts...)\n\tklog.SetLogger(log)\n\tklog.SetLevel(klog.LevelTrace)\n\tklog.SetOutput(output)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/common/mtl/metrics.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"net\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/kitex/pkg/registry\"\n\t\"github.com/cloudwego/kitex/server\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/collectors\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n)\n\nvar Registry *prometheus.Registry\n\nfunc InitMetric(serviceName string, metricsPort string, registryAddr string) {\n\tRegistry = prometheus.NewRegistry()\n\tRegistry.MustRegister(collectors.NewGoCollector())\n\tRegistry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))\n\n\tr, _ := consul.NewConsulRegister(registryAddr)\n\n\taddr, _ := net.ResolveTCPAddr(\"tcp\", metricsPort)\n\n\tregistryInfo := &registry.Info{\n\t\tServiceName: \"prometheus\",\n\t\tAddr:        addr,\n\t\tWeight:      1,\n\t\tTags:        map[string]string{\"service\": serviceName},\n\t}\n\n\t_ = r.Register(registryInfo)\n\n\tserver.RegisterShutdownHook(func() {\n\t\tr.Deregister(registryInfo) //nolint:errcheck\n\t})\n\n\thttp.Handle(\"/metrics\", promhttp.HandlerFor(Registry, promhttp.HandlerOpts{}))\n\tgo http.ListenAndServe(metricsPort, nil) //nolint:errcheck\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/common/mtl/tracing.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/server\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.17.0\"\n)\n\nvar TracerProvider *tracesdk.TracerProvider\n\nfunc InitTracing(serviceName string) {\n\texporter, err := otlptracegrpc.New(context.Background())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tserver.RegisterShutdownHook(func() {\n\t\texporter.Shutdown(context.Background()) //nolint:errcheck\n\t})\n\tprocessor := tracesdk.NewBatchSpanProcessor(exporter)\n\tres, err := resource.New(context.Background(), resource.WithAttributes(semconv.ServiceNameKey.String(serviceName)))\n\tif err != nil {\n\t\tres = resource.Default()\n\t}\n\tTracerProvider = tracesdk.NewTracerProvider(tracesdk.WithSpanProcessor(processor), tracesdk.WithResource(res))\n\totel.SetTracerProvider(TracerProvider)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/common/serversuite/server.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage serversuite\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\tprometheus \"github.com/kitex-contrib/monitor-prometheus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n)\n\ntype CommonServerSuite struct {\n\tCurrentServiceName string\n}\n\nfunc (s CommonServerSuite) Options() []server.Option {\n\topts := []server.Option{\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t}\n\n\t_ = provider.NewOpenTelemetryProvider(provider.WithSdkTracerProvider(mtl.TracerProvider), provider.WithEnableMetrics(false))\n\n\topts = append(opts,\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\t\tServiceName: s.CurrentServiceName,\n\t\t}),\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithTracer(prometheus.NewServerTracer(\"\", \"\", prometheus.WithDisableServer(true), prometheus.WithRegistry(mtl.Registry))),\n\t)\n\n\treturn opts\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/common/utils/kitex.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/tutorial/ch15/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"unique\"`\n\tPassword string `gorm:\"varchar(64),not null\"`\n}\n\nfunc (u User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\tmysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"a958af3702caf245d205da6164afebe0\"})\n\tvar u model.User\n\tmysql.DB.First(&u)\n\tfmt.Printf(\"%#v\", u)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch15/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch15/deploy/config/prometheus.yml",
    "content": "global:\n  scrape_interval: 15s\n\nscrape_configs:\n  - job_name: \"consul\"\n    consul_sd_configs:\n      - server: consul:8500\n        services:\n          - prometheus\n    relabel_configs:\n      - source_labels: [ __meta_consul_tags ]\n        action: replace\n        target_label: service\n        regex: \".*service:(.*?),.*\"\n        replacement: \"$1\"\n\n      - source_labels: [ __meta_consul_service_id ]\n        target_label: __metrics_path__\n        replacement: /metrics\n"
  },
  {
    "path": "gomall/tutorial/ch15/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: \"redis:latest\"\n    ports:\n      - 6379:6379\n  nats:\n    image: nats:latest\n    ports:\n      - \"4222:4222\"\n      - \"8222:8222\"\n  # Jaeger\n  jaeger-all-in-one:\n    image: jaegertracing/all-in-one:latest\n    ports:\n      - \"16686:16686\"\n      - \"4317:4317\"\n      - \"4318:4318\"\n  prometheus:\n    image: prom/prometheus:latest\n    volumes:\n      - ./deploy/config/prometheus.yml:/etc/prometheus/prometheus.yml\n    command:\n      - \"--config.file=/etc/prometheus/prometheus.yml\"\n    ports:\n      - \"9090:9090\"\n"
  },
  {
    "path": "gomall/tutorial/ch15/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/cart\n\t./app/checkout\n\t./app/email\n\t./app/frontend\n\t./app/order\n\t./app/payment\n\t./app/product\n\t./app/user\n\t./common\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/andeya/ameda v1.5.3 // indirect\n\tgithub.com/andeya/goutil v1.0.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.11 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.7.0 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.3.0 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/hello_world/go.sum",
    "content": "github.com/andeya/ameda v1.5.3 h1:SvqnhQPZwwabS8HQTRGfJwWPl2w9ZIPInHAw9aE1Wlk=\ngithub.com/andeya/ameda v1.5.3/go.mod h1:FQDHRe1I995v6GG+8aJ7UIUToEmbdTJn/U26NCPIgXQ=\ngithub.com/andeya/goutil v1.0.1 h1:eiYwVyAnnK0dXU5FJsNjExkJW4exUGn/xefPt3k4eXg=\ngithub.com/andeya/goutil v1.0.1/go.mod h1:jEG5/QnnhG7yGxwFUX6Q+JGMif7sjdHmmNVjn7nhJDo=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11 h1:jJgmoDKPKacGl0llPYbYL/+/2N+Ng0vV0ipbnVssXHY=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11/go.mod h1:UAyKh4ZRLBPGsyTRFZoPqTni1TlojMdOJXQnEIPCX84=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=\ngithub.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/nyaruka/phonenumbers v1.3.0 h1:IFyyJfF2Elg8xGKFghWrRXzb6qAHk+Q3uPqmIgS20JQ=\ngithub.com/nyaruka/phonenumbers v1.3.0/go.mod h1:4jyKp/BFUokLbCHyoZag+T3S1KezFVoEKtgnbpzItC4=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch15/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n  optional string raw_body = 50101;\n  optional string query = 50102;\n  optional string header = 50103;\n  optional string cookie = 50104;\n  optional string body = 50105;\n  optional string path = 50106;\n  optional string vd = 50107;\n  optional string form = 50108;\n  optional string js_conv = 50109;\n  optional string file_name = 50110;\n  optional string none = 50111;\n\n  // 50131~50160 used to extend field option by hz\n  optional string form_compatible = 50131;\n  optional string js_conv_compatible = 50132;\n  optional string file_name_compatible = 50133;\n  optional string none_compatible = 50134;\n  // 50135 is reserved to vt_compatible\n  // optional FieldRules vt_compatible = 50135;\n\n  optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n  optional string get = 50201;\n  optional string post = 50202;\n  optional string put = 50203;\n  optional string delete = 50204;\n  optional string patch = 50205;\n  optional string options = 50206;\n  optional string head = 50207;\n  optional string any = 50208;\n  optional string gen_path =\n      50301; // The path specified by the user when the client code is\n             // generated, with a higher priority than api_version\n  optional string api_version =\n      50302; // Specify the value of the :version variable in path when the\n             // client code is generated\n  optional string tag = 50303;  // rpc tag, can be multiple, separated by commas\n  optional string name = 50304; // Name of rpc\n  optional string api_level = 50305;  // Interface Level\n  optional string serializer = 50306; // Serialization method\n  optional string param =\n      50307; // Whether client requests take public parameters\n  optional string baseurl = 50308; // Baseurl used in ttnet routing\n  optional string handler_path =\n      50309; // handler_path specifies the path to generate the method\n\n  // 50331~50360 used to extend method option by hz\n  optional string handler_path_compatible =\n      50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n  optional int32 http_code = 50401;\n\n  // 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n  optional string base_domain = 50402;\n\n  // 50731~50760 used to extend service option by hz\n  optional string base_domain_compatible = 50731;\n  optional string service_path = 50732;\n}\n\nextend google.protobuf.MessageOptions {\n  // optional FieldRules msg_vt = 50111;\n\n  optional string reserve = 50830;\n  // 550831 is reserved to msg_vt_compatible\n  // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/idl/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart;\n\noption go_package = '/cart';\n\nservice CartService {\n  rpc AddItem(AddItemReq) returns (AddItemResp) {}\n  rpc GetCart(GetCartReq) returns (GetCartResp) {}\n  rpc EmptyCart(EmptyCartReq) returns (EmptyCartResp) {}\n}\n\nmessage CartItem {\n  uint32 product_id = 1;\n  int32  quantity = 2;\n}\n\nmessage AddItemReq {\n  uint32 user_id = 1;\n  CartItem item = 2;\n}\n\nmessage AddItemResp {}\n\nmessage EmptyCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartResp {\n  Cart cart = 1;\n}\n\nmessage Cart {\n  uint32 user_id = 1;\n  repeated CartItem items = 2;\n}\n\nmessage EmptyCartResp {}\n"
  },
  {
    "path": "gomall/tutorial/ch15/idl/checkout.proto",
    "content": "syntax = \"proto3\";\n\npackage  checkout;\n\nimport \"payment.proto\";\n\noption go_package = \"/checkout\";\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (CheckoutResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  string zip_code = 5;\n}\n\nmessage CheckoutReq {\n  uint32 user_id = 1;\n  string firstname = 2;\n  string lastname = 3;\n  string email = 4;\n  Address address = 5;\n  payment.CreditCardInfo credit_card = 6;\n}\n\nmessage CheckoutResp {\n  string order_id = 1;\n  string transaction_id = 2;\n}"
  },
  {
    "path": "gomall/tutorial/ch15/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch15/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch15/idl/email.proto",
    "content": "syntax = \"proto3\";\n\npackage email;\n\noption go_package = \"/email\";\n\nmessage EmailReq{\n  string from = 1;\n  string to = 2;\n  string content_type = 3;\n  string subject = 4;\n  string content = 5;\n}\n\nmessage EmailResp {\n\n}\n\nservice EmailService{\n  rpc Send(EmailReq) returns (EmailResp);\n}"
  },
  {
    "path": "gomall/tutorial/ch15/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\noption go_package = \"/frontend/auth\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage RegisterReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string confirm_password = 3 [(api.form) = \"confirm_password\"];\n}\n\nmessage LoginReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string next = 3 [(api.query) = \"next\"];\n}\n\nservice AuthService {\n  rpc register(RegisterReq) returns (common.Empty) {\n    option (api.post) = \"/auth/register\";\n  }\n  rpc login(LoginReq) returns (common.Empty) {\n    option (api.post) = \"/auth/login\";\n  }\n  rpc logout(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/auth/logout\";\n  }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/idl/frontend/cart_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.cart;\n\noption go_package = \"/frontend/cart\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage AddCartReq {\n  uint32 product_id = 1 [(api.form) = \"productId\"];\n  int32 product_num = 2 [(api.form) = \"productNum\"];\n}\n\nservice CartService {\n  rpc AddCartItem(AddCartReq) returns (common.Empty) {\n    option (api.post) = \"/cart\";\n  }\n  rpc GetCart(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/cart\";\n  }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/idl/frontend/category_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.category;\n\noption go_package = \"/frontend/category\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CategoryReq { string category = 1 [(api.path)=\"category\"]; }\n\nservice CategoryService {\n  rpc Category(CategoryReq) returns (common.Empty) {\n    option (api.get) = \"/category/:category\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch15/idl/frontend/checkout_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.checkout;\n\noption go_package = \"/frontend/checkout\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CheckoutReq {\n  string email = 1 [(api.form) = \"email\"];\n  string firstname = 2 [(api.form) = \"firstname\"];\n  string lastname = 3 [(api.form) = \"lastname\"];\n  string street = 4 [(api.form) = \"street\"];\n  string zipcode = 5 [(api.form) = \"zipcode\"];\n  string province = 6 [(api.form) = \"province\"];\n  string country = 7 [(api.form) = \"country\"];\n  string city = 8 [(api.form) = \"city\"];\n  string card_num = 9 [(api.form) = \"cardNum\"];\n  int32 expiration_month = 10 [(api.form) = \"expirationMonth\"];\n  int32 expiration_year = 11 [(api.form) = \"expirationYear\"];\n  int32 cvv = 12 [(api.form) = \"cvv\"];\n  string payment = 13 [(api.form) = \"payment\"];\n}\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (common.Empty) {\n    option (api.get) = \"/checkout\";\n  }\n  rpc CheckoutWaiting(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/checkout/waiting\";\n  }\n  rpc CheckoutResult(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/checkout/result\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch15/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\nmessage Empty {}"
  },
  {
    "path": "gomall/tutorial/ch15/idl/frontend/home.proto",
    "content": "syntax = 'proto3';\n\npackage frontend.common;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/home\";\n\nservice HomeService {\n  rpc Home(common.Empty) returns (Empty) { option (api.get) = \"/\"; }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/idl/frontend/order_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.order;\n\noption go_package = \"/frontend/order\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nservice OrderService {\n  rpc OrderList(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/order\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch15/idl/frontend/product_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.product;\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\noption go_package = \"frontend/product\";\n\nmessage ProductReq { uint32 id = 1 [ (api.query) = \"id\" ]; }\n\nservice ProductService {\n  rpc GetProduct(ProductReq) returns (common.Empty) {\n    option (api.get) = \"/product\";\n  };\n}"
  },
  {
    "path": "gomall/tutorial/ch15/idl/order.proto",
    "content": "syntax = \"proto3\";\n\npackage order;\n\nimport \"cart.proto\";\n\noption go_package = \"order\";\n\nservice OrderService {\n  rpc PlaceOrder(PlaceOrderReq) returns (PlaceOrderResp) {}\n  rpc ListOrder(ListOrderReq) returns (ListOrderResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  int32 zip_code = 5;\n}\n\nmessage PlaceOrderReq {\n  uint32 user_id = 1;\n  string user_currency = 2;\n\n  Address address = 3;\n  string email = 4;\n  repeated OrderItem order_items = 5;\n}\n\nmessage OrderItem {\n  cart.CartItem item = 1;\n  float cost = 2;\n}\n\nmessage OrderResult {\n  string order_id = 1;\n}\n\nmessage PlaceOrderResp {\n  OrderResult order = 1;\n}\n\nmessage ListOrderReq {\n  uint32 user_id = 1;\n}\n\nmessage Order {\n  repeated OrderItem order_items = 1;\n  string order_id = 2;\n  uint32 user_id = 3;\n  string user_currency = 4;\n  Address address = 5;\n  string email = 6;\n  int32 created_at = 7;\n}\n\nmessage ListOrderResp {\n  repeated Order orders = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/idl/payment.proto",
    "content": "syntax = \"proto3\";\n\npackage payment;\n\noption go_package = \"payment\";\n\n\nservice PaymentService {\n  rpc Charge(ChargeReq) returns (ChargeResp) {}\n}\n\nmessage CreditCardInfo {\n  string credit_card_number = 1;\n  int32 credit_card_cvv = 2;\n  int32 credit_card_expiration_year = 3;\n  int32 credit_card_expiration_month = 4;\n}\n\nmessage ChargeReq {\n  float amount = 1;\n  CreditCardInfo credit_card = 2;\n  string order_id = 3;\n  uint32 user_id = 4;\n}\n\nmessage ChargeResp {\n  string transaction_id = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/idl/product.proto",
    "content": "syntax = \"proto3\";\n\npackage product;\n\noption go_package = \"/product\";\n\nservice ProductCatalogService {\n  rpc ListProducts(ListProductsReq) returns (ListProductsResp) {}\n  rpc GetProduct(GetProductReq) returns (GetProductResp) {}\n  rpc SearchProducts(SearchProductsReq) returns (SearchProductsResp) {}\n}\n\nmessage ListProductsReq{\n  int32 page = 1;\n  int64 pageSize = 2;\n\n  string categoryName = 3;\n}\n\nmessage Product {\n  uint32 id = 1;\n  string name = 2;\n  string description = 3;\n  string picture = 4;\n  float price = 5;\n\n  repeated string categories = 6;\n}\n\nmessage ListProductsResp {\n  repeated Product products = 1;\n}\n\nmessage GetProductReq {\n  uint32 id = 1;\n}\n\nmessage GetProductResp {\n  Product product = 1;\n}\n\nmessage SearchProductsReq {\n  string query = 1;\n}\n\nmessage SearchProductsResp {\n  repeated Product results = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/idl/user.proto",
    "content": "syntax=\"proto3\";\n\npackage user;\n\noption go_package=\"/user\";\n\nservice UserService {\n    rpc Register(RegisterReq) returns (RegisterResp) {}\n    rpc Login(LoginReq) returns (LoginResp) {}\n}\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string confirm_password = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email= 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.5\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgoogle.golang.org/protobuf v1.36.6\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/cart/cart.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CartItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CartItem[number], err)\n}\n\nfunc (x *CartItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.ProductId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CartItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Quantity, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_AddItemReq[number], err)\n}\n\nfunc (x *AddItemReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *AddItemResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmptyCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmptyCartReq[number], err)\n}\n\nfunc (x *EmptyCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartReq[number], err)\n}\n\nfunc (x *GetCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartResp[number], err)\n}\n\nfunc (x *GetCartResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Cart\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Cart = &v\n\treturn offset, nil\n}\n\nfunc (x *Cart) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Cart[number], err)\n}\n\nfunc (x *Cart) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Cart) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *EmptyCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *CartItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.ProductId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetProductId())\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Quantity == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetQuantity())\n\treturn offset\n}\n\nfunc (x *AddItemReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItem())\n\treturn offset\n}\n\nfunc (x *AddItemResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Cart == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetCart())\n\treturn offset\n}\n\nfunc (x *Cart) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField2(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *CartItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CartItem) sizeField1() (n int) {\n\tif x.ProductId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetProductId())\n\treturn n\n}\n\nfunc (x *CartItem) sizeField2() (n int) {\n\tif x.Quantity == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetQuantity())\n\treturn n\n}\n\nfunc (x *AddItemReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField2() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetItem())\n\treturn n\n}\n\nfunc (x *AddItemResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *EmptyCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartResp) sizeField1() (n int) {\n\tif x.Cart == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetCart())\n\treturn n\n}\n\nfunc (x *Cart) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *Cart) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Cart) sizeField2() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(2, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_CartItem = map[int32]string{\n\t1: \"ProductId\",\n\t2: \"Quantity\",\n}\n\nvar fieldIDToName_AddItemReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Item\",\n}\n\nvar fieldIDToName_AddItemResp = map[int32]string{}\n\nvar fieldIDToName_EmptyCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartResp = map[int32]string{\n\t1: \"Cart\",\n}\n\nvar fieldIDToName_Cart = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Items\",\n}\n\nvar fieldIDToName_EmptyCartResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/cart/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: cart.proto\n\npackage cart\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\"`\n\tQuantity  int32  `protobuf:\"varint,2,opt,name=quantity,proto3\" json:\"quantity,omitempty\"`\n}\n\nfunc (x *CartItem) Reset() {\n\t*x = CartItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartItem) ProtoMessage() {}\n\nfunc (x *CartItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartItem.ProtoReflect.Descriptor instead.\nfunc (*CartItem) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartItem) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetQuantity() int32 {\n\tif x != nil {\n\t\treturn x.Quantity\n\t}\n\treturn 0\n}\n\ntype AddItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32    `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItem   *CartItem `protobuf:\"bytes,2,opt,name=item,proto3\" json:\"item,omitempty\"`\n}\n\nfunc (x *AddItemReq) Reset() {\n\t*x = AddItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemReq) ProtoMessage() {}\n\nfunc (x *AddItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddItemReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *AddItemReq) GetItem() *CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\ntype AddItemResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *AddItemResp) Reset() {\n\t*x = AddItemResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemResp) ProtoMessage() {}\n\nfunc (x *AddItemResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemResp.ProtoReflect.Descriptor instead.\nfunc (*AddItemResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{2}\n}\n\ntype EmptyCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *EmptyCartReq) Reset() {\n\t*x = EmptyCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartReq) ProtoMessage() {}\n\nfunc (x *EmptyCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartReq.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EmptyCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *GetCartReq) Reset() {\n\t*x = GetCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReq) ProtoMessage() {}\n\nfunc (x *GetCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReq.ProtoReflect.Descriptor instead.\nfunc (*GetCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCart *Cart `protobuf:\"bytes,1,opt,name=cart,proto3\" json:\"cart,omitempty\"`\n}\n\nfunc (x *GetCartResp) Reset() {\n\t*x = GetCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartResp) ProtoMessage() {}\n\nfunc (x *GetCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartResp.ProtoReflect.Descriptor instead.\nfunc (*GetCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *GetCartResp) GetCart() *Cart {\n\tif x != nil {\n\t\treturn x.Cart\n\t}\n\treturn nil\n}\n\ntype Cart struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32      `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItems  []*CartItem `protobuf:\"bytes,2,rep,name=items,proto3\" json:\"items,omitempty\"`\n}\n\nfunc (x *Cart) Reset() {\n\t*x = Cart{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Cart) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Cart) ProtoMessage() {}\n\nfunc (x *Cart) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Cart.ProtoReflect.Descriptor instead.\nfunc (*Cart) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Cart) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Cart) GetItems() []*CartItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\ntype EmptyCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmptyCartResp) Reset() {\n\t*x = EmptyCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartResp) ProtoMessage() {}\n\nfunc (x *EmptyCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartResp.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{7}\n}\n\nvar File_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x08, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0a, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04,\n\t0x69, 0x74, 0x65, 0x6d, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x27, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0a,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x1e, 0x0a, 0x04, 0x63, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x52, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x04, 0x43, 0x61, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74,\n\t0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x45, 0x6d, 0x70,\n\t0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x32, 0xa9, 0x01, 0x0a, 0x0b, 0x43,\n\t0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x47,\n\t0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36,\n\t0x0a, 0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x12, 0x12, 0x2e, 0x63, 0x61,\n\t0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a,\n\t0x13, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62,\n\t0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72,\n\t0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_proto_rawDescOnce sync.Once\n\tfile_cart_proto_rawDescData = file_cart_proto_rawDesc\n)\n\nfunc file_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_proto_rawDescData)\n\t})\n\treturn file_cart_proto_rawDescData\n}\n\nvar file_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_cart_proto_goTypes = []interface{}{\n\t(*CartItem)(nil),      // 0: cart.CartItem\n\t(*AddItemReq)(nil),    // 1: cart.AddItemReq\n\t(*AddItemResp)(nil),   // 2: cart.AddItemResp\n\t(*EmptyCartReq)(nil),  // 3: cart.EmptyCartReq\n\t(*GetCartReq)(nil),    // 4: cart.GetCartReq\n\t(*GetCartResp)(nil),   // 5: cart.GetCartResp\n\t(*Cart)(nil),          // 6: cart.Cart\n\t(*EmptyCartResp)(nil), // 7: cart.EmptyCartResp\n}\nvar file_cart_proto_depIdxs = []int32{\n\t0, // 0: cart.AddItemReq.item:type_name -> cart.CartItem\n\t6, // 1: cart.GetCartResp.cart:type_name -> cart.Cart\n\t0, // 2: cart.Cart.items:type_name -> cart.CartItem\n\t1, // 3: cart.CartService.AddItem:input_type -> cart.AddItemReq\n\t4, // 4: cart.CartService.GetCart:input_type -> cart.GetCartReq\n\t3, // 5: cart.CartService.EmptyCart:input_type -> cart.EmptyCartReq\n\t2, // 6: cart.CartService.AddItem:output_type -> cart.AddItemResp\n\t5, // 7: cart.CartService.GetCart:output_type -> cart.GetCartResp\n\t7, // 8: cart.CartService.EmptyCart:output_type -> cart.EmptyCartResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_proto_init() }\nfunc file_cart_proto_init() {\n\tif File_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Cart); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_proto = out.File\n\tfile_cart_proto_rawDesc = nil\n\tfile_cart_proto_goTypes = nil\n\tfile_cart_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CartService interface {\n\tAddItem(ctx context.Context, req *AddItemReq) (res *AddItemResp, err error)\n\tGetCart(ctx context.Context, req *GetCartReq) (res *GetCartResp, err error)\n\tEmptyCart(ctx context.Context, req *EmptyCartReq) (res *EmptyCartResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/cart/cartservice/cartservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfo\n}\n\nvar cartServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CartService\"\n\thandlerType := (*cart.CartService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"AddItem\":   kitex.NewMethodInfo(addItemHandler, newAddItemArgs, newAddItemResult, false),\n\t\t\"GetCart\":   kitex.NewMethodInfo(getCartHandler, newGetCartArgs, newGetCartResult, false),\n\t\t\"EmptyCart\": kitex.NewMethodInfo(emptyCartHandler, newEmptyCartArgs, newEmptyCartResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"cart\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc addItemHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.AddItemReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).AddItem(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *AddItemArgs:\n\t\tsuccess, err := handler.(cart.CartService).AddItem(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*AddItemResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newAddItemArgs() interface{} {\n\treturn &AddItemArgs{}\n}\n\nfunc newAddItemResult() interface{} {\n\treturn &AddItemResult{}\n}\n\ntype AddItemArgs struct {\n\tReq *cart.AddItemReq\n}\n\nfunc (p *AddItemArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.AddItemReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *AddItemArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *AddItemArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *AddItemArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar AddItemArgs_Req_DEFAULT *cart.AddItemReq\n\nfunc (p *AddItemArgs) GetReq() *cart.AddItemReq {\n\tif !p.IsSetReq() {\n\t\treturn AddItemArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *AddItemArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *AddItemArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype AddItemResult struct {\n\tSuccess *cart.AddItemResp\n}\n\nvar AddItemResult_Success_DEFAULT *cart.AddItemResp\n\nfunc (p *AddItemResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.AddItemResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *AddItemResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *AddItemResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *AddItemResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *AddItemResult) GetSuccess() *cart.AddItemResp {\n\tif !p.IsSetSuccess() {\n\t\treturn AddItemResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *AddItemResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.AddItemResp)\n}\n\nfunc (p *AddItemResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *AddItemResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.GetCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).GetCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).GetCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetCartArgs() interface{} {\n\treturn &GetCartArgs{}\n}\n\nfunc newGetCartResult() interface{} {\n\treturn &GetCartResult{}\n}\n\ntype GetCartArgs struct {\n\tReq *cart.GetCartReq\n}\n\nfunc (p *GetCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.GetCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetCartArgs_Req_DEFAULT *cart.GetCartReq\n\nfunc (p *GetCartArgs) GetReq() *cart.GetCartReq {\n\tif !p.IsSetReq() {\n\t\treturn GetCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetCartResult struct {\n\tSuccess *cart.GetCartResp\n}\n\nvar GetCartResult_Success_DEFAULT *cart.GetCartResp\n\nfunc (p *GetCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.GetCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetCartResult) GetSuccess() *cart.GetCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.GetCartResp)\n}\n\nfunc (p *GetCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc emptyCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.EmptyCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).EmptyCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EmptyCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).EmptyCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EmptyCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEmptyCartArgs() interface{} {\n\treturn &EmptyCartArgs{}\n}\n\nfunc newEmptyCartResult() interface{} {\n\treturn &EmptyCartResult{}\n}\n\ntype EmptyCartArgs struct {\n\tReq *cart.EmptyCartReq\n}\n\nfunc (p *EmptyCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.EmptyCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EmptyCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EmptyCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EmptyCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EmptyCartArgs_Req_DEFAULT *cart.EmptyCartReq\n\nfunc (p *EmptyCartArgs) GetReq() *cart.EmptyCartReq {\n\tif !p.IsSetReq() {\n\t\treturn EmptyCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EmptyCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EmptyCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EmptyCartResult struct {\n\tSuccess *cart.EmptyCartResp\n}\n\nvar EmptyCartResult_Success_DEFAULT *cart.EmptyCartResp\n\nfunc (p *EmptyCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.EmptyCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EmptyCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EmptyCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EmptyCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EmptyCartResult) GetSuccess() *cart.EmptyCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn EmptyCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EmptyCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.EmptyCartResp)\n}\n\nfunc (p *EmptyCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EmptyCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) AddItem(ctx context.Context, Req *cart.AddItemReq) (r *cart.AddItemResp, err error) {\n\tvar _args AddItemArgs\n\t_args.Req = Req\n\tvar _result AddItemResult\n\tif err = p.c.Call(ctx, \"AddItem\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetCart(ctx context.Context, Req *cart.GetCartReq) (r *cart.GetCartResp, err error) {\n\tvar _args GetCartArgs\n\t_args.Req = Req\n\tvar _result GetCartResult\n\tif err = p.c.Call(ctx, \"GetCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq) (r *cart.EmptyCartResp, err error) {\n\tvar _args EmptyCartArgs\n\t_args.Req = Req\n\tvar _result EmptyCartResult\n\tif err = p.c.Call(ctx, \"EmptyCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/cart/cartservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCartServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCartServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCartServiceClient) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.AddItem(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetCart(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.EmptyCart(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/cart/cartservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler cart.CartService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/cart/cartservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler cart.CartService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/checkout/checkout.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tfmt \"fmt\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutReq[number], err)\n}\n\nfunc (x *CheckoutReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Firstname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Lastname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutReq) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v payment.CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutResp[number], err)\n}\n\nfunc (x *CheckoutResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutResp) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Firstname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetFirstname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Lastname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetLastname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField6(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 6, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField2(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *CheckoutReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField2() (n int) {\n\tif x.Firstname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetFirstname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField3() (n int) {\n\tif x.Lastname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetLastname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField6() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(6, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *CheckoutResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField2() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_CheckoutReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Firstname\",\n\t3: \"Lastname\",\n\t4: \"Email\",\n\t5: \"Address\",\n\t6: \"CreditCard\",\n}\n\nvar fieldIDToName_CheckoutResp = map[int32]string{\n\t1: \"OrderId\",\n\t2: \"TransactionId\",\n}\n\nvar _ = payment.File_payment_proto\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/checkout/checkout.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: checkout.proto\n\npackage checkout\n\nimport (\n\tcontext \"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       string `protobuf:\"bytes,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() string {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn \"\"\n}\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId     uint32                  `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tFirstname  string                  `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\"`\n\tLastname   string                  `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\"`\n\tEmail      string                  `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tAddress    *Address                `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tCreditCard *payment.CreditCardInfo `protobuf:\"bytes,6,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CheckoutReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *CheckoutReq) GetCreditCard() *payment.CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\ntype CheckoutResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId       string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tTransactionId string `protobuf:\"bytes,2,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *CheckoutResp) Reset() {\n\t*x = CheckoutResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutResp) ProtoMessage() {}\n\nfunc (x *CheckoutResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutResp.ProtoReflect.Descriptor instead.\nfunc (*CheckoutResp) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CheckoutResp) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_proto protoreflect.FileDescriptor\n\nvar file_checkout_proto_rawDesc = []byte{\n\t0x0a, 0x0e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x0d, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f,\n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,\n\t0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,\n\t0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79,\n\t0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x0b,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75,\n\t0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73,\n\t0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x22, 0x50, 0x0a, 0x0c, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,\n\t0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x4e, 0x0a,\n\t0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x3b, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x15, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_proto_rawDescOnce sync.Once\n\tfile_checkout_proto_rawDescData = file_checkout_proto_rawDesc\n)\n\nfunc file_checkout_proto_rawDescGZIP() []byte {\n\tfile_checkout_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_proto_rawDescData)\n\t})\n\treturn file_checkout_proto_rawDescData\n}\n\nvar file_checkout_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_checkout_proto_goTypes = []interface{}{\n\t(*Address)(nil),                // 0: checkout.Address\n\t(*CheckoutReq)(nil),            // 1: checkout.CheckoutReq\n\t(*CheckoutResp)(nil),           // 2: checkout.CheckoutResp\n\t(*payment.CreditCardInfo)(nil), // 3: payment.CreditCardInfo\n}\nvar file_checkout_proto_depIdxs = []int32{\n\t0, // 0: checkout.CheckoutReq.address:type_name -> checkout.Address\n\t3, // 1: checkout.CheckoutReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 2: checkout.CheckoutService.Checkout:input_type -> checkout.CheckoutReq\n\t2, // 3: checkout.CheckoutService.Checkout:output_type -> checkout.CheckoutResp\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_proto_init() }\nfunc file_checkout_proto_init() {\n\tif File_checkout_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_proto = out.File\n\tfile_checkout_proto_rawDesc = nil\n\tfile_checkout_proto_goTypes = nil\n\tfile_checkout_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CheckoutService interface {\n\tCheckout(ctx context.Context, req *CheckoutReq) (res *CheckoutResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/checkout/checkoutservice/checkoutservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfo\n}\n\nvar checkoutServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CheckoutService\"\n\thandlerType := (*checkout.CheckoutService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Checkout\": kitex.NewMethodInfo(checkoutHandler, newCheckoutArgs, newCheckoutResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"checkout\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc checkoutHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(checkout.CheckoutReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(checkout.CheckoutService).Checkout(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *CheckoutArgs:\n\t\tsuccess, err := handler.(checkout.CheckoutService).Checkout(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*CheckoutResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newCheckoutArgs() interface{} {\n\treturn &CheckoutArgs{}\n}\n\nfunc newCheckoutResult() interface{} {\n\treturn &CheckoutResult{}\n}\n\ntype CheckoutArgs struct {\n\tReq *checkout.CheckoutReq\n}\n\nfunc (p *CheckoutArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(checkout.CheckoutReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *CheckoutArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *CheckoutArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *CheckoutArgs) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar CheckoutArgs_Req_DEFAULT *checkout.CheckoutReq\n\nfunc (p *CheckoutArgs) GetReq() *checkout.CheckoutReq {\n\tif !p.IsSetReq() {\n\t\treturn CheckoutArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *CheckoutArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *CheckoutArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype CheckoutResult struct {\n\tSuccess *checkout.CheckoutResp\n}\n\nvar CheckoutResult_Success_DEFAULT *checkout.CheckoutResp\n\nfunc (p *CheckoutResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(checkout.CheckoutResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *CheckoutResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *CheckoutResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *CheckoutResult) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *CheckoutResult) GetSuccess() *checkout.CheckoutResp {\n\tif !p.IsSetSuccess() {\n\t\treturn CheckoutResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *CheckoutResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*checkout.CheckoutResp)\n}\n\nfunc (p *CheckoutResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *CheckoutResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq) (r *checkout.CheckoutResp, err error) {\n\tvar _args CheckoutArgs\n\t_args.Req = Req\n\tvar _result CheckoutResult\n\tif err = p.c.Call(ctx, \"Checkout\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/checkout/checkoutservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCheckoutServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCheckoutServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCheckoutServiceClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Checkout(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/checkout/checkoutservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler checkout.CheckoutService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/checkout/checkoutservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler checkout.CheckoutService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/email/email.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage email\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *EmailReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmailReq[number], err)\n}\n\nfunc (x *EmailReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.From, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.To, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ContentType, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Subject, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Content, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmailReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.From == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetFrom())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.To == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTo())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ContentType == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetContentType())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Subject == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetSubject())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Content == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetContent())\n\treturn offset\n}\n\nfunc (x *EmailResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmailReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField1() (n int) {\n\tif x.From == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetFrom())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField2() (n int) {\n\tif x.To == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTo())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField3() (n int) {\n\tif x.ContentType == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetContentType())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField4() (n int) {\n\tif x.Subject == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetSubject())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField5() (n int) {\n\tif x.Content == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetContent())\n\treturn n\n}\n\nfunc (x *EmailResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_EmailReq = map[int32]string{\n\t1: \"From\",\n\t2: \"To\",\n\t3: \"ContentType\",\n\t4: \"Subject\",\n\t5: \"Content\",\n}\n\nvar fieldIDToName_EmailResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/email/email.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: email.proto\n\npackage email\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype EmailReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFrom        string `protobuf:\"bytes,1,opt,name=from,proto3\" json:\"from,omitempty\"`\n\tTo          string `protobuf:\"bytes,2,opt,name=to,proto3\" json:\"to,omitempty\"`\n\tContentType string `protobuf:\"bytes,3,opt,name=content_type,json=contentType,proto3\" json:\"content_type,omitempty\"`\n\tSubject     string `protobuf:\"bytes,4,opt,name=subject,proto3\" json:\"subject,omitempty\"`\n\tContent     string `protobuf:\"bytes,5,opt,name=content,proto3\" json:\"content,omitempty\"`\n}\n\nfunc (x *EmailReq) Reset() {\n\t*x = EmailReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailReq) ProtoMessage() {}\n\nfunc (x *EmailReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailReq.ProtoReflect.Descriptor instead.\nfunc (*EmailReq) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *EmailReq) GetFrom() string {\n\tif x != nil {\n\t\treturn x.From\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetTo() string {\n\tif x != nil {\n\t\treturn x.To\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContentType() string {\n\tif x != nil {\n\t\treturn x.ContentType\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetSubject() string {\n\tif x != nil {\n\t\treturn x.Subject\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\ntype EmailResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmailResp) Reset() {\n\t*x = EmailResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailResp) ProtoMessage() {}\n\nfunc (x *EmailResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailResp.ProtoReflect.Descriptor instead.\nfunc (*EmailResp) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{1}\n}\n\nvar File_email_proto protoreflect.FileDescriptor\n\nvar file_email_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x08, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65,\n\t0x71, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x0b, 0x0a, 0x09,\n\t0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x32, 0x39, 0x0a, 0x0c, 0x45, 0x6d, 0x61,\n\t0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x53, 0x65, 0x6e,\n\t0x64, 0x12, 0x0f, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52,\n\t0x65, 0x71, 0x1a, 0x10, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c,\n\t0x52, 0x65, 0x73, 0x70, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63,\n\t0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_email_proto_rawDescOnce sync.Once\n\tfile_email_proto_rawDescData = file_email_proto_rawDesc\n)\n\nfunc file_email_proto_rawDescGZIP() []byte {\n\tfile_email_proto_rawDescOnce.Do(func() {\n\t\tfile_email_proto_rawDescData = protoimpl.X.CompressGZIP(file_email_proto_rawDescData)\n\t})\n\treturn file_email_proto_rawDescData\n}\n\nvar file_email_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_email_proto_goTypes = []interface{}{\n\t(*EmailReq)(nil),  // 0: email.EmailReq\n\t(*EmailResp)(nil), // 1: email.EmailResp\n}\nvar file_email_proto_depIdxs = []int32{\n\t0, // 0: email.EmailService.Send:input_type -> email.EmailReq\n\t1, // 1: email.EmailService.Send:output_type -> email.EmailResp\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_email_proto_init() }\nfunc file_email_proto_init() {\n\tif File_email_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_email_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_email_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_email_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_email_proto_goTypes,\n\t\tDependencyIndexes: file_email_proto_depIdxs,\n\t\tMessageInfos:      file_email_proto_msgTypes,\n\t}.Build()\n\tFile_email_proto = out.File\n\tfile_email_proto_rawDesc = nil\n\tfile_email_proto_goTypes = nil\n\tfile_email_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype EmailService interface {\n\tSend(ctx context.Context, req *EmailReq) (res *EmailResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/email/emailservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEmailServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEmailServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kEmailServiceClient) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Send(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/email/emailservice/emailservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn emailServiceServiceInfo\n}\n\nvar emailServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"EmailService\"\n\thandlerType := (*email.EmailService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Send\": kitex.NewMethodInfo(sendHandler, newSendArgs, newSendResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"email\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc sendHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(email.EmailReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(email.EmailService).Send(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SendArgs:\n\t\tsuccess, err := handler.(email.EmailService).Send(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SendResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSendArgs() interface{} {\n\treturn &SendArgs{}\n}\n\nfunc newSendResult() interface{} {\n\treturn &SendResult{}\n}\n\ntype SendArgs struct {\n\tReq *email.EmailReq\n}\n\nfunc (p *SendArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(email.EmailReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SendArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SendArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SendArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SendArgs) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SendArgs_Req_DEFAULT *email.EmailReq\n\nfunc (p *SendArgs) GetReq() *email.EmailReq {\n\tif !p.IsSetReq() {\n\t\treturn SendArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SendArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SendArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SendResult struct {\n\tSuccess *email.EmailResp\n}\n\nvar SendResult_Success_DEFAULT *email.EmailResp\n\nfunc (p *SendResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(email.EmailResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SendResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SendResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SendResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SendResult) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SendResult) GetSuccess() *email.EmailResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SendResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SendResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*email.EmailResp)\n}\n\nfunc (p *SendResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SendResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Send(ctx context.Context, Req *email.EmailReq) (r *email.EmailResp, err error) {\n\tvar _args SendArgs\n\t_args.Req = Req\n\tvar _result SendResult\n\tif err = p.c.Call(ctx, \"Send\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/email/emailservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler email.EmailService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/email/emailservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler email.EmailService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/order/order.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage order\n\nimport (\n\tfmt \"fmt\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderReq[number], err)\n}\n\nfunc (x *PlaceOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *PlaceOrderReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderItem[number], err)\n}\n\nfunc (x *OrderItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v cart.CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Cost, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *OrderResult) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderResult[number], err)\n}\n\nfunc (x *OrderResult) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderResp[number], err)\n}\n\nfunc (x *PlaceOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderResult\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Order = &v\n\treturn offset, nil\n}\n\nfunc (x *ListOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderReq[number], err)\n}\n\nfunc (x *ListOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 7:\n\t\toffset, err = x.fastReadField7(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Order[number], err)\n}\n\nfunc (x *Order) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField7(buf []byte, _type int8) (offset int, err error) {\n\tx.CreatedAt, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderResp[number], err)\n}\n\nfunc (x *ListOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Order\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Orders = append(x.Orders, &v)\n\treturn offset, nil\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 3, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *OrderItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItem())\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Cost == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 2, x.GetCost())\n\treturn offset\n}\n\nfunc (x *OrderResult) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderResult) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Order == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrder())\n\treturn offset\n}\n\nfunc (x *ListOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\toffset += x.fastWriteField7(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField2(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField3(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 3, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField6(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 6, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField7(buf []byte) (offset int) {\n\tif x.CreatedAt == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 7, x.GetCreatedAt())\n\treturn offset\n}\n\nfunc (x *ListOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Orders == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrders() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrders()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField2() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField3() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(3, x.GetAddress())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField5() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(5, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *OrderItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField1() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetItem())\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField2() (n int) {\n\tif x.Cost == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(2, x.GetCost())\n\treturn n\n}\n\nfunc (x *OrderResult) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *OrderResult) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) sizeField1() (n int) {\n\tif x.Order == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetOrder())\n\treturn n\n}\n\nfunc (x *ListOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\tn += x.sizeField7()\n\treturn n\n}\n\nfunc (x *Order) sizeField1() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *Order) sizeField2() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *Order) sizeField3() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(3, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) sizeField4() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *Order) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *Order) sizeField6() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(6, x.GetEmail())\n\treturn n\n}\n\nfunc (x *Order) sizeField7() (n int) {\n\tif x.CreatedAt == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(7, x.GetCreatedAt())\n\treturn n\n}\n\nfunc (x *ListOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderResp) sizeField1() (n int) {\n\tif x.Orders == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrders() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrders()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_PlaceOrderReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"UserCurrency\",\n\t3: \"Address\",\n\t4: \"Email\",\n\t5: \"OrderItems\",\n}\n\nvar fieldIDToName_OrderItem = map[int32]string{\n\t1: \"Item\",\n\t2: \"Cost\",\n}\n\nvar fieldIDToName_OrderResult = map[int32]string{\n\t1: \"OrderId\",\n}\n\nvar fieldIDToName_PlaceOrderResp = map[int32]string{\n\t1: \"Order\",\n}\n\nvar fieldIDToName_ListOrderReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_Order = map[int32]string{\n\t1: \"OrderItems\",\n\t2: \"OrderId\",\n\t3: \"UserId\",\n\t4: \"UserCurrency\",\n\t5: \"Address\",\n\t6: \"Email\",\n\t7: \"CreatedAt\",\n}\n\nvar fieldIDToName_ListOrderResp = map[int32]string{\n\t1: \"Orders\",\n}\n\nvar _ = cart.File_cart_proto\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/order/order.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: order.proto\n\npackage order\n\nimport (\n\tcontext \"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       int32  `protobuf:\"varint,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() int32 {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn 0\n}\n\ntype PlaceOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId       uint32       `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,2,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,3,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tOrderItems   []*OrderItem `protobuf:\"bytes,5,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n}\n\nfunc (x *PlaceOrderReq) Reset() {\n\t*x = PlaceOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderReq) ProtoMessage() {}\n\nfunc (x *PlaceOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderReq.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *PlaceOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *PlaceOrderReq) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *PlaceOrderReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\ntype OrderItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItem *cart.CartItem `protobuf:\"bytes,1,opt,name=item,proto3\" json:\"item,omitempty\"`\n\tCost float32        `protobuf:\"fixed32,2,opt,name=cost,proto3\" json:\"cost,omitempty\"`\n}\n\nfunc (x *OrderItem) Reset() {\n\t*x = OrderItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderItem) ProtoMessage() {}\n\nfunc (x *OrderItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderItem.ProtoReflect.Descriptor instead.\nfunc (*OrderItem) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *OrderItem) GetItem() *cart.CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\nfunc (x *OrderItem) GetCost() float32 {\n\tif x != nil {\n\t\treturn x.Cost\n\t}\n\treturn 0\n}\n\ntype OrderResult struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n}\n\nfunc (x *OrderResult) Reset() {\n\t*x = OrderResult{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderResult) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderResult) ProtoMessage() {}\n\nfunc (x *OrderResult) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderResult.ProtoReflect.Descriptor instead.\nfunc (*OrderResult) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *OrderResult) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\ntype PlaceOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrder *OrderResult `protobuf:\"bytes,1,opt,name=order,proto3\" json:\"order,omitempty\"`\n}\n\nfunc (x *PlaceOrderResp) Reset() {\n\t*x = PlaceOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderResp) ProtoMessage() {}\n\nfunc (x *PlaceOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderResp.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PlaceOrderResp) GetOrder() *OrderResult {\n\tif x != nil {\n\t\treturn x.Order\n\t}\n\treturn nil\n}\n\ntype ListOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ListOrderReq) Reset() {\n\t*x = ListOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderReq) ProtoMessage() {}\n\nfunc (x *ListOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderReq.ProtoReflect.Descriptor instead.\nfunc (*ListOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ListOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype Order struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderItems   []*OrderItem `protobuf:\"bytes,1,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n\tOrderId      string       `protobuf:\"bytes,2,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId       uint32       `protobuf:\"varint,3,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,4,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,6,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tCreatedAt    int32        `protobuf:\"varint,7,opt,name=created_at,json=createdAt,proto3\" json:\"created_at,omitempty\"`\n}\n\nfunc (x *Order) Reset() {\n\t*x = Order{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Order) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Order) ProtoMessage() {}\n\nfunc (x *Order) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Order.ProtoReflect.Descriptor instead.\nfunc (*Order) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Order) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Order) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetCreatedAt() int32 {\n\tif x != nil {\n\t\treturn x.CreatedAt\n\t}\n\treturn 0\n}\n\ntype ListOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrders []*Order `protobuf:\"bytes,1,rep,name=orders,proto3\" json:\"orders,omitempty\"`\n}\n\nfunc (x *ListOrderResp) Reset() {\n\t*x = ListOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderResp) ProtoMessage() {}\n\nfunc (x *ListOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderResp.ProtoReflect.Descriptor instead.\nfunc (*ListOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ListOrderResp) GetOrders() []*Order {\n\tif x != nil {\n\t\treturn x.Orders\n\t}\n\treturn nil\n}\n\nvar File_order_proto protoreflect.FileDescriptor\n\nvar file_order_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x1a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a,\n\t0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,\n\t0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63,\n\t0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f,\n\t0x64, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65,\n\t0x72, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a,\n\t0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e,\n\t0x63, 0x79, 0x12, 0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05,\n\t0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d,\n\t0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e,\n\t0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x43, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74,\n\t0x65, 0x6d, 0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d,\n\t0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x28, 0x0a, 0x0b, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x22, 0x27, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf2, 0x01, 0x0a, 0x05, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65,\n\t0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65,\n\t0x72, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49,\n\t0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12,\n\t0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x35,\n\t0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12,\n\t0x24, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x0c, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x73, 0x32, 0x85, 0x01, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f,\n\t0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61,\n\t0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73,\n\t0x70, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72,\n\t0x12, 0x13, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3e, 0x5a,\n\t0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_order_proto_rawDescOnce sync.Once\n\tfile_order_proto_rawDescData = file_order_proto_rawDesc\n)\n\nfunc file_order_proto_rawDescGZIP() []byte {\n\tfile_order_proto_rawDescOnce.Do(func() {\n\t\tfile_order_proto_rawDescData = protoimpl.X.CompressGZIP(file_order_proto_rawDescData)\n\t})\n\treturn file_order_proto_rawDescData\n}\n\nvar file_order_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_order_proto_goTypes = []interface{}{\n\t(*Address)(nil),        // 0: order.Address\n\t(*PlaceOrderReq)(nil),  // 1: order.PlaceOrderReq\n\t(*OrderItem)(nil),      // 2: order.OrderItem\n\t(*OrderResult)(nil),    // 3: order.OrderResult\n\t(*PlaceOrderResp)(nil), // 4: order.PlaceOrderResp\n\t(*ListOrderReq)(nil),   // 5: order.ListOrderReq\n\t(*Order)(nil),          // 6: order.Order\n\t(*ListOrderResp)(nil),  // 7: order.ListOrderResp\n\t(*cart.CartItem)(nil),  // 8: cart.CartItem\n}\nvar file_order_proto_depIdxs = []int32{\n\t0, // 0: order.PlaceOrderReq.address:type_name -> order.Address\n\t2, // 1: order.PlaceOrderReq.order_items:type_name -> order.OrderItem\n\t8, // 2: order.OrderItem.item:type_name -> cart.CartItem\n\t3, // 3: order.PlaceOrderResp.order:type_name -> order.OrderResult\n\t2, // 4: order.Order.order_items:type_name -> order.OrderItem\n\t0, // 5: order.Order.address:type_name -> order.Address\n\t6, // 6: order.ListOrderResp.orders:type_name -> order.Order\n\t1, // 7: order.OrderService.PlaceOrder:input_type -> order.PlaceOrderReq\n\t5, // 8: order.OrderService.ListOrder:input_type -> order.ListOrderReq\n\t4, // 9: order.OrderService.PlaceOrder:output_type -> order.PlaceOrderResp\n\t7, // 10: order.OrderService.ListOrder:output_type -> order.ListOrderResp\n\t9, // [9:11] is the sub-list for method output_type\n\t7, // [7:9] is the sub-list for method input_type\n\t7, // [7:7] is the sub-list for extension type_name\n\t7, // [7:7] is the sub-list for extension extendee\n\t0, // [0:7] is the sub-list for field type_name\n}\n\nfunc init() { file_order_proto_init() }\nfunc file_order_proto_init() {\n\tif File_order_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_order_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderResult); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Order); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_proto_goTypes,\n\t\tDependencyIndexes: file_order_proto_depIdxs,\n\t\tMessageInfos:      file_order_proto_msgTypes,\n\t}.Build()\n\tFile_order_proto = out.File\n\tfile_order_proto_rawDesc = nil\n\tfile_order_proto_goTypes = nil\n\tfile_order_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype OrderService interface {\n\tPlaceOrder(ctx context.Context, req *PlaceOrderReq) (res *PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, req *ListOrderReq) (res *ListOrderResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/order/orderservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kOrderServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kOrderServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kOrderServiceClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.PlaceOrder(ctx, Req)\n}\n\nfunc (p *kOrderServiceClient) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListOrder(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/order/orderservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler order.OrderService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/order/orderservice/orderservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn orderServiceServiceInfo\n}\n\nvar orderServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"OrderService\"\n\thandlerType := (*order.OrderService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"PlaceOrder\": kitex.NewMethodInfo(placeOrderHandler, newPlaceOrderArgs, newPlaceOrderResult, false),\n\t\t\"ListOrder\":  kitex.NewMethodInfo(listOrderHandler, newListOrderArgs, newListOrderResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"order\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc placeOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.PlaceOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).PlaceOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *PlaceOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).PlaceOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*PlaceOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newPlaceOrderArgs() interface{} {\n\treturn &PlaceOrderArgs{}\n}\n\nfunc newPlaceOrderResult() interface{} {\n\treturn &PlaceOrderResult{}\n}\n\ntype PlaceOrderArgs struct {\n\tReq *order.PlaceOrderReq\n}\n\nfunc (p *PlaceOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.PlaceOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *PlaceOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *PlaceOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar PlaceOrderArgs_Req_DEFAULT *order.PlaceOrderReq\n\nfunc (p *PlaceOrderArgs) GetReq() *order.PlaceOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn PlaceOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *PlaceOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PlaceOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype PlaceOrderResult struct {\n\tSuccess *order.PlaceOrderResp\n}\n\nvar PlaceOrderResult_Success_DEFAULT *order.PlaceOrderResp\n\nfunc (p *PlaceOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.PlaceOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *PlaceOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *PlaceOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *PlaceOrderResult) GetSuccess() *order.PlaceOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn PlaceOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *PlaceOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.PlaceOrderResp)\n}\n\nfunc (p *PlaceOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PlaceOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc listOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.ListOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).ListOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).ListOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListOrderArgs() interface{} {\n\treturn &ListOrderArgs{}\n}\n\nfunc newListOrderResult() interface{} {\n\treturn &ListOrderResult{}\n}\n\ntype ListOrderArgs struct {\n\tReq *order.ListOrderReq\n}\n\nfunc (p *ListOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.ListOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListOrderArgs_Req_DEFAULT *order.ListOrderReq\n\nfunc (p *ListOrderArgs) GetReq() *order.ListOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn ListOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListOrderResult struct {\n\tSuccess *order.ListOrderResp\n}\n\nvar ListOrderResult_Success_DEFAULT *order.ListOrderResp\n\nfunc (p *ListOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.ListOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListOrderResult) GetSuccess() *order.ListOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.ListOrderResp)\n}\n\nfunc (p *ListOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq) (r *order.PlaceOrderResp, err error) {\n\tvar _args PlaceOrderArgs\n\t_args.Req = Req\n\tvar _result PlaceOrderResult\n\tif err = p.c.Call(ctx, \"PlaceOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) ListOrder(ctx context.Context, Req *order.ListOrderReq) (r *order.ListOrderResp, err error) {\n\tvar _args ListOrderArgs\n\t_args.Req = Req\n\tvar _result ListOrderResult\n\tif err = p.c.Call(ctx, \"ListOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/order/orderservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler order.OrderService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/payment/payment.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage payment\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CreditCardInfo) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CreditCardInfo[number], err)\n}\n\nfunc (x *CreditCardInfo) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardNumber, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardCvv, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationYear, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationMonth, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeReq[number], err)\n}\n\nfunc (x *ChargeReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Amount, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *ChargeReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeResp[number], err)\n}\n\nfunc (x *ChargeResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField1(buf []byte) (offset int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetCreditCardNumber())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetCreditCardCvv())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField3(buf []byte) (offset int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 3, x.GetCreditCardExpirationYear())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField4(buf []byte) (offset int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 4, x.GetCreditCardExpirationMonth())\n\treturn offset\n}\n\nfunc (x *ChargeReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Amount == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 1, x.GetAmount())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 4, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *ChargeResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField1() (n int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetCreditCardNumber())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField2() (n int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetCreditCardCvv())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField3() (n int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(3, x.GetCreditCardExpirationYear())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField4() (n int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(4, x.GetCreditCardExpirationMonth())\n\treturn n\n}\n\nfunc (x *ChargeReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField1() (n int) {\n\tif x.Amount == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(1, x.GetAmount())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField2() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField3() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField4() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(4, x.GetUserId())\n\treturn n\n}\n\nfunc (x *ChargeResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ChargeResp) sizeField1() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_CreditCardInfo = map[int32]string{\n\t1: \"CreditCardNumber\",\n\t2: \"CreditCardCvv\",\n\t3: \"CreditCardExpirationYear\",\n\t4: \"CreditCardExpirationMonth\",\n}\n\nvar fieldIDToName_ChargeReq = map[int32]string{\n\t1: \"Amount\",\n\t2: \"CreditCard\",\n\t3: \"OrderId\",\n\t4: \"UserId\",\n}\n\nvar fieldIDToName_ChargeResp = map[int32]string{\n\t1: \"TransactionId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/payment/payment.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: payment.proto\n\npackage payment\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CreditCardInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCreditCardNumber          string `protobuf:\"bytes,1,opt,name=credit_card_number,json=creditCardNumber,proto3\" json:\"credit_card_number,omitempty\"`\n\tCreditCardCvv             int32  `protobuf:\"varint,2,opt,name=credit_card_cvv,json=creditCardCvv,proto3\" json:\"credit_card_cvv,omitempty\"`\n\tCreditCardExpirationYear  int32  `protobuf:\"varint,3,opt,name=credit_card_expiration_year,json=creditCardExpirationYear,proto3\" json:\"credit_card_expiration_year,omitempty\"`\n\tCreditCardExpirationMonth int32  `protobuf:\"varint,4,opt,name=credit_card_expiration_month,json=creditCardExpirationMonth,proto3\" json:\"credit_card_expiration_month,omitempty\"`\n}\n\nfunc (x *CreditCardInfo) Reset() {\n\t*x = CreditCardInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreditCardInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreditCardInfo) ProtoMessage() {}\n\nfunc (x *CreditCardInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreditCardInfo.ProtoReflect.Descriptor instead.\nfunc (*CreditCardInfo) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreditCardInfo) GetCreditCardNumber() string {\n\tif x != nil {\n\t\treturn x.CreditCardNumber\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreditCardInfo) GetCreditCardCvv() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardCvv\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationMonth\n\t}\n\treturn 0\n}\n\ntype ChargeReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAmount     float32         `protobuf:\"fixed32,1,opt,name=amount,proto3\" json:\"amount,omitempty\"`\n\tCreditCard *CreditCardInfo `protobuf:\"bytes,2,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n\tOrderId    string          `protobuf:\"bytes,3,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId     uint32          `protobuf:\"varint,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ChargeReq) Reset() {\n\t*x = ChargeReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeReq) ProtoMessage() {}\n\nfunc (x *ChargeReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeReq.ProtoReflect.Descriptor instead.\nfunc (*ChargeReq) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ChargeReq) GetAmount() float32 {\n\tif x != nil {\n\t\treturn x.Amount\n\t}\n\treturn 0\n}\n\nfunc (x *ChargeReq) GetCreditCard() *CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\nfunc (x *ChargeReq) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *ChargeReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype ChargeResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTransactionId string `protobuf:\"bytes,1,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *ChargeResp) Reset() {\n\t*x = ChargeResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeResp) ProtoMessage() {}\n\nfunc (x *ChargeResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeResp.ProtoReflect.Descriptor instead.\nfunc (*ChargeResp) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ChargeResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_payment_proto protoreflect.FileDescriptor\n\nvar file_payment_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x12, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65,\n\t0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43,\n\t0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x76, 0x76, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x43, 0x76,\n\t0x76, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61, 0x72,\n\t0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f,\n\t0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x6e, 0x74,\n\t0x68, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12,\n\t0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52,\n\t0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69,\n\t0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,\n\t0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,\n\t0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75,\n\t0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61,\n\t0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x45, 0x0a, 0x0e, 0x50, 0x61,\n\t0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x06,\n\t0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x61, 0x79,\n\t0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_payment_proto_rawDescOnce sync.Once\n\tfile_payment_proto_rawDescData = file_payment_proto_rawDesc\n)\n\nfunc file_payment_proto_rawDescGZIP() []byte {\n\tfile_payment_proto_rawDescOnce.Do(func() {\n\t\tfile_payment_proto_rawDescData = protoimpl.X.CompressGZIP(file_payment_proto_rawDescData)\n\t})\n\treturn file_payment_proto_rawDescData\n}\n\nvar file_payment_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_payment_proto_goTypes = []interface{}{\n\t(*CreditCardInfo)(nil), // 0: payment.CreditCardInfo\n\t(*ChargeReq)(nil),      // 1: payment.ChargeReq\n\t(*ChargeResp)(nil),     // 2: payment.ChargeResp\n}\nvar file_payment_proto_depIdxs = []int32{\n\t0, // 0: payment.ChargeReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 1: payment.PaymentService.Charge:input_type -> payment.ChargeReq\n\t2, // 2: payment.PaymentService.Charge:output_type -> payment.ChargeResp\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_payment_proto_init() }\nfunc file_payment_proto_init() {\n\tif File_payment_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_payment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreditCardInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_payment_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_payment_proto_goTypes,\n\t\tDependencyIndexes: file_payment_proto_depIdxs,\n\t\tMessageInfos:      file_payment_proto_msgTypes,\n\t}.Build()\n\tFile_payment_proto = out.File\n\tfile_payment_proto_rawDesc = nil\n\tfile_payment_proto_goTypes = nil\n\tfile_payment_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype PaymentService interface {\n\tCharge(ctx context.Context, req *ChargeReq) (res *ChargeResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/payment/paymentservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kPaymentServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kPaymentServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kPaymentServiceClient) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Charge(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/payment/paymentservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler payment.PaymentService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/payment/paymentservice/paymentservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfo\n}\n\nvar paymentServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"PaymentService\"\n\thandlerType := (*payment.PaymentService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Charge\": kitex.NewMethodInfo(chargeHandler, newChargeArgs, newChargeResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"payment\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc chargeHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(payment.ChargeReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(payment.PaymentService).Charge(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ChargeArgs:\n\t\tsuccess, err := handler.(payment.PaymentService).Charge(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ChargeResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newChargeArgs() interface{} {\n\treturn &ChargeArgs{}\n}\n\nfunc newChargeResult() interface{} {\n\treturn &ChargeResult{}\n}\n\ntype ChargeArgs struct {\n\tReq *payment.ChargeReq\n}\n\nfunc (p *ChargeArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(payment.ChargeReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ChargeArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ChargeArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ChargeArgs) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ChargeArgs_Req_DEFAULT *payment.ChargeReq\n\nfunc (p *ChargeArgs) GetReq() *payment.ChargeReq {\n\tif !p.IsSetReq() {\n\t\treturn ChargeArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ChargeArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ChargeArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ChargeResult struct {\n\tSuccess *payment.ChargeResp\n}\n\nvar ChargeResult_Success_DEFAULT *payment.ChargeResp\n\nfunc (p *ChargeResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(payment.ChargeResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ChargeResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ChargeResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ChargeResult) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ChargeResult) GetSuccess() *payment.ChargeResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ChargeResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ChargeResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*payment.ChargeResp)\n}\n\nfunc (p *ChargeResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ChargeResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Charge(ctx context.Context, Req *payment.ChargeReq) (r *payment.ChargeResp, err error) {\n\tvar _args ChargeArgs\n\t_args.Req = Req\n\tvar _result ChargeResult\n\tif err = p.c.Call(ctx, \"Charge\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/payment/paymentservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler payment.PaymentService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/product/product.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *ListProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsReq[number], err)\n}\n\nfunc (x *ListProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Page, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.PageSize, offset, err = fastpb.ReadInt64(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CategoryName, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Product[number], err)\n}\n\nfunc (x *Product) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Name, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Description, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Picture, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Price, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v string\n\tv, offset, err = fastpb.ReadString(buf, _type)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Categories = append(x.Categories, v)\n\treturn offset, err\n}\n\nfunc (x *ListProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsResp[number], err)\n}\n\nfunc (x *ListProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Products = append(x.Products, &v)\n\treturn offset, nil\n}\n\nfunc (x *GetProductReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductReq[number], err)\n}\n\nfunc (x *GetProductReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetProductResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductResp[number], err)\n}\n\nfunc (x *GetProductResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Product = &v\n\treturn offset, nil\n}\n\nfunc (x *SearchProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsReq[number], err)\n}\n\nfunc (x *SearchProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Query, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *SearchProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsResp[number], err)\n}\n\nfunc (x *SearchProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Results = append(x.Results, &v)\n\treturn offset, nil\n}\n\nfunc (x *ListProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Page == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetPage())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.PageSize == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt64(buf[offset:], 2, x.GetPageSize())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.CategoryName == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetCategoryName())\n\treturn offset\n}\n\nfunc (x *Product) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField2(buf []byte) (offset int) {\n\tif x.Name == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetName())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField3(buf []byte) (offset int) {\n\tif x.Description == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetDescription())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField4(buf []byte) (offset int) {\n\tif x.Picture == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetPicture())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField5(buf []byte) (offset int) {\n\tif x.Price == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 5, x.GetPrice())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField6(buf []byte) (offset int) {\n\tif len(x.Categories) == 0 {\n\t\treturn offset\n\t}\n\tfor i := range x.GetCategories() {\n\t\toffset += fastpb.WriteString(buf[offset:], 6, x.GetCategories()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Products == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetProducts() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProducts()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *GetProductReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *GetProductResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Product == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProduct())\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Query == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetQuery())\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Results == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetResults() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetResults()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField1() (n int) {\n\tif x.Page == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetPage())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField2() (n int) {\n\tif x.PageSize == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt64(2, x.GetPageSize())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField3() (n int) {\n\tif x.CategoryName == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetCategoryName())\n\treturn n\n}\n\nfunc (x *Product) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Product) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *Product) sizeField2() (n int) {\n\tif x.Name == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetName())\n\treturn n\n}\n\nfunc (x *Product) sizeField3() (n int) {\n\tif x.Description == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetDescription())\n\treturn n\n}\n\nfunc (x *Product) sizeField4() (n int) {\n\tif x.Picture == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetPicture())\n\treturn n\n}\n\nfunc (x *Product) sizeField5() (n int) {\n\tif x.Price == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(5, x.GetPrice())\n\treturn n\n}\n\nfunc (x *Product) sizeField6() (n int) {\n\tif len(x.Categories) == 0 {\n\t\treturn n\n\t}\n\tfor i := range x.GetCategories() {\n\t\tn += fastpb.SizeString(6, x.GetCategories()[i])\n\t}\n\treturn n\n}\n\nfunc (x *ListProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListProductsResp) sizeField1() (n int) {\n\tif x.Products == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetProducts() {\n\t\tn += fastpb.SizeMessage(1, x.GetProducts()[i])\n\t}\n\treturn n\n}\n\nfunc (x *GetProductReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductReq) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *GetProductResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductResp) sizeField1() (n int) {\n\tif x.Product == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetProduct())\n\treturn n\n}\n\nfunc (x *SearchProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsReq) sizeField1() (n int) {\n\tif x.Query == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetQuery())\n\treturn n\n}\n\nfunc (x *SearchProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsResp) sizeField1() (n int) {\n\tif x.Results == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetResults() {\n\t\tn += fastpb.SizeMessage(1, x.GetResults()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_ListProductsReq = map[int32]string{\n\t1: \"Page\",\n\t2: \"PageSize\",\n\t3: \"CategoryName\",\n}\n\nvar fieldIDToName_Product = map[int32]string{\n\t1: \"Id\",\n\t2: \"Name\",\n\t3: \"Description\",\n\t4: \"Picture\",\n\t5: \"Price\",\n\t6: \"Categories\",\n}\n\nvar fieldIDToName_ListProductsResp = map[int32]string{\n\t1: \"Products\",\n}\n\nvar fieldIDToName_GetProductReq = map[int32]string{\n\t1: \"Id\",\n}\n\nvar fieldIDToName_GetProductResp = map[int32]string{\n\t1: \"Product\",\n}\n\nvar fieldIDToName_SearchProductsReq = map[int32]string{\n\t1: \"Query\",\n}\n\nvar fieldIDToName_SearchProductsResp = map[int32]string{\n\t1: \"Results\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/product/product.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: product.proto\n\npackage product\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPage         int32  `protobuf:\"varint,1,opt,name=page,proto3\" json:\"page,omitempty\"`\n\tPageSize     int64  `protobuf:\"varint,2,opt,name=pageSize,proto3\" json:\"pageSize,omitempty\"`\n\tCategoryName string `protobuf:\"bytes,3,opt,name=categoryName,proto3\" json:\"categoryName,omitempty\"`\n}\n\nfunc (x *ListProductsReq) Reset() {\n\t*x = ListProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsReq) ProtoMessage() {}\n\nfunc (x *ListProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsReq.ProtoReflect.Descriptor instead.\nfunc (*ListProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListProductsReq) GetPage() int32 {\n\tif x != nil {\n\t\treturn x.Page\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetPageSize() int64 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetCategoryName() string {\n\tif x != nil {\n\t\treturn x.CategoryName\n\t}\n\treturn \"\"\n}\n\ntype Product struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          uint32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string   `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tPicture     string   `protobuf:\"bytes,4,opt,name=picture,proto3\" json:\"picture,omitempty\"`\n\tPrice       float32  `protobuf:\"fixed32,5,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tCategories  []string `protobuf:\"bytes,6,rep,name=categories,proto3\" json:\"categories,omitempty\"`\n}\n\nfunc (x *Product) Reset() {\n\t*x = Product{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Product) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Product) ProtoMessage() {}\n\nfunc (x *Product) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Product.ProtoReflect.Descriptor instead.\nfunc (*Product) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Product) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPicture() string {\n\tif x != nil {\n\t\treturn x.Picture\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPrice() float32 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetCategories() []string {\n\tif x != nil {\n\t\treturn x.Categories\n\t}\n\treturn nil\n}\n\ntype ListProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProducts []*Product `protobuf:\"bytes,1,rep,name=products,proto3\" json:\"products,omitempty\"`\n}\n\nfunc (x *ListProductsResp) Reset() {\n\t*x = ListProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsResp) ProtoMessage() {}\n\nfunc (x *ListProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsResp.ProtoReflect.Descriptor instead.\nfunc (*ListProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListProductsResp) GetProducts() []*Product {\n\tif x != nil {\n\t\treturn x.Products\n\t}\n\treturn nil\n}\n\ntype GetProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetProductReq) Reset() {\n\t*x = GetProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductReq) ProtoMessage() {}\n\nfunc (x *GetProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductReq.ProtoReflect.Descriptor instead.\nfunc (*GetProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetProductResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProduct *Product `protobuf:\"bytes,1,opt,name=product,proto3\" json:\"product,omitempty\"`\n}\n\nfunc (x *GetProductResp) Reset() {\n\t*x = GetProductResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductResp) ProtoMessage() {}\n\nfunc (x *GetProductResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductResp.ProtoReflect.Descriptor instead.\nfunc (*GetProductResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetProductResp) GetProduct() *Product {\n\tif x != nil {\n\t\treturn x.Product\n\t}\n\treturn nil\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *SearchProductsReq) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\ntype SearchProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*Product `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *SearchProductsResp) Reset() {\n\t*x = SearchProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsResp) ProtoMessage() {}\n\nfunc (x *SearchProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsResp.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SearchProductsResp) GetResults() []*Product {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_product_proto protoreflect.FileDescriptor\n\nvar file_product_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x65, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12,\n\t0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63,\n\t0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22,\n\t0x9f, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70,\n\t0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63,\n\t0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18,\n\t0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65,\n\t0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,\n\t0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x40, 0x0a,\n\t0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x32,\n\t0xec, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x61, 0x74, 0x61, 0x6c,\n\t0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x4c, 0x69, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x12, 0x3f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x16,\n\t0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x12, 0x4b, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65,\n\t0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x1a,\n\t0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x40,\n\t0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b,\n\t0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_proto_rawDescOnce sync.Once\n\tfile_product_proto_rawDescData = file_product_proto_rawDesc\n)\n\nfunc file_product_proto_rawDescGZIP() []byte {\n\tfile_product_proto_rawDescOnce.Do(func() {\n\t\tfile_product_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_proto_rawDescData)\n\t})\n\treturn file_product_proto_rawDescData\n}\n\nvar file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_product_proto_goTypes = []interface{}{\n\t(*ListProductsReq)(nil),    // 0: product.ListProductsReq\n\t(*Product)(nil),            // 1: product.Product\n\t(*ListProductsResp)(nil),   // 2: product.ListProductsResp\n\t(*GetProductReq)(nil),      // 3: product.GetProductReq\n\t(*GetProductResp)(nil),     // 4: product.GetProductResp\n\t(*SearchProductsReq)(nil),  // 5: product.SearchProductsReq\n\t(*SearchProductsResp)(nil), // 6: product.SearchProductsResp\n}\nvar file_product_proto_depIdxs = []int32{\n\t1, // 0: product.ListProductsResp.products:type_name -> product.Product\n\t1, // 1: product.GetProductResp.product:type_name -> product.Product\n\t1, // 2: product.SearchProductsResp.results:type_name -> product.Product\n\t0, // 3: product.ProductCatalogService.ListProducts:input_type -> product.ListProductsReq\n\t3, // 4: product.ProductCatalogService.GetProduct:input_type -> product.GetProductReq\n\t5, // 5: product.ProductCatalogService.SearchProducts:input_type -> product.SearchProductsReq\n\t2, // 6: product.ProductCatalogService.ListProducts:output_type -> product.ListProductsResp\n\t4, // 7: product.ProductCatalogService.GetProduct:output_type -> product.GetProductResp\n\t6, // 8: product.ProductCatalogService.SearchProducts:output_type -> product.SearchProductsResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_product_proto_init() }\nfunc file_product_proto_init() {\n\tif File_product_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Product); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_proto_goTypes,\n\t\tDependencyIndexes: file_product_proto_depIdxs,\n\t\tMessageInfos:      file_product_proto_msgTypes,\n\t}.Build()\n\tFile_product_proto = out.File\n\tfile_product_proto_rawDesc = nil\n\tfile_product_proto_goTypes = nil\n\tfile_product_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype ProductCatalogService interface {\n\tListProducts(ctx context.Context, req *ListProductsReq) (res *ListProductsResp, err error)\n\tGetProduct(ctx context.Context, req *GetProductReq) (res *GetProductResp, err error)\n\tSearchProducts(ctx context.Context, req *SearchProductsReq) (res *SearchProductsResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/product/productcatalogservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductCatalogServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductCatalogServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductCatalogServiceClient) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.SearchProducts(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/product/productcatalogservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductCatalogService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/product/productcatalogservice/productcatalogservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfo\n}\n\nvar productCatalogServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"ProductCatalogService\"\n\thandlerType := (*product.ProductCatalogService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"ListProducts\":   kitex.NewMethodInfo(listProductsHandler, newListProductsArgs, newListProductsResult, false),\n\t\t\"GetProduct\":     kitex.NewMethodInfo(getProductHandler, newGetProductArgs, newGetProductResult, false),\n\t\t\"SearchProducts\": kitex.NewMethodInfo(searchProductsHandler, newSearchProductsArgs, newSearchProductsResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"product\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.ListProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).ListProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).ListProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListProductsArgs() interface{} {\n\treturn &ListProductsArgs{}\n}\n\nfunc newListProductsResult() interface{} {\n\treturn &ListProductsResult{}\n}\n\ntype ListProductsArgs struct {\n\tReq *product.ListProductsReq\n}\n\nfunc (p *ListProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.ListProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListProductsArgs_Req_DEFAULT *product.ListProductsReq\n\nfunc (p *ListProductsArgs) GetReq() *product.ListProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn ListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListProductsResult struct {\n\tSuccess *product.ListProductsResp\n}\n\nvar ListProductsResult_Success_DEFAULT *product.ListProductsResp\n\nfunc (p *ListProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.ListProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListProductsResult) GetSuccess() *product.ListProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.ListProductsResp)\n}\n\nfunc (p *ListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.GetProductReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).GetProduct(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetProductArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).GetProduct(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetProductResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetProductArgs() interface{} {\n\treturn &GetProductArgs{}\n}\n\nfunc newGetProductResult() interface{} {\n\treturn &GetProductResult{}\n}\n\ntype GetProductArgs struct {\n\tReq *product.GetProductReq\n}\n\nfunc (p *GetProductArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.GetProductReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetProductArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetProductArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetProductArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetProductArgs_Req_DEFAULT *product.GetProductReq\n\nfunc (p *GetProductArgs) GetReq() *product.GetProductReq {\n\tif !p.IsSetReq() {\n\t\treturn GetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetProductResult struct {\n\tSuccess *product.GetProductResp\n}\n\nvar GetProductResult_Success_DEFAULT *product.GetProductResp\n\nfunc (p *GetProductResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.GetProductResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetProductResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetProductResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetProductResult) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetProductResult) GetSuccess() *product.GetProductResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.GetProductResp)\n}\n\nfunc (p *GetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc searchProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.SearchProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).SearchProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SearchProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).SearchProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SearchProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSearchProductsArgs() interface{} {\n\treturn &SearchProductsArgs{}\n}\n\nfunc newSearchProductsResult() interface{} {\n\treturn &SearchProductsResult{}\n}\n\ntype SearchProductsArgs struct {\n\tReq *product.SearchProductsReq\n}\n\nfunc (p *SearchProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.SearchProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SearchProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SearchProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SearchProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SearchProductsArgs_Req_DEFAULT *product.SearchProductsReq\n\nfunc (p *SearchProductsArgs) GetReq() *product.SearchProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn SearchProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SearchProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SearchProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SearchProductsResult struct {\n\tSuccess *product.SearchProductsResp\n}\n\nvar SearchProductsResult_Success_DEFAULT *product.SearchProductsResp\n\nfunc (p *SearchProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.SearchProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SearchProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SearchProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SearchProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SearchProductsResult) GetSuccess() *product.SearchProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SearchProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SearchProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.SearchProductsResp)\n}\n\nfunc (p *SearchProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SearchProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, Req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args ListProductsArgs\n\t_args.Req = Req\n\tvar _result ListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, Req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args GetProductArgs\n\t_args.Req = Req\n\tvar _result GetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq) (r *product.SearchProductsResp, err error) {\n\tvar _args SearchProductsArgs\n\t_args.Req = Req\n\tvar _result SearchProductsResult\n\tif err = p.c.Call(ctx, \"SearchProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/product/productcatalogservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductCatalogService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ConfirmPassword, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetConfirmPassword())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetConfirmPassword())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"ConfirmPassword\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Register\": kitex.NewMethodInfo(registerHandler, newRegisterArgs, newRegisterResult, false),\n\t\t\"Login\":    kitex.NewMethodInfo(loginHandler, newLoginArgs, newLoginResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"user\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/cart/cart_client.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() cartservice.Client\n\tService() string\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := cartservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient cartservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() cartservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\treturn c.kitexClient.AddItem(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\treturn c.kitexClient.GetCart(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\treturn c.kitexClient.EmptyCart(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/cart/cart_default.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc AddItem(ctx context.Context, req *cart.AddItemReq, callOptions ...callopt.Option) (resp *cart.AddItemResp, err error) {\n\tresp, err = defaultClient.AddItem(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"AddItem call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetCart(ctx context.Context, req *cart.GetCartReq, callOptions ...callopt.Option) (resp *cart.GetCartResp, err error) {\n\tresp, err = defaultClient.GetCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc EmptyCart(ctx context.Context, req *cart.EmptyCartReq, callOptions ...callopt.Option) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = defaultClient.EmptyCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"EmptyCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/cart/cart_init.go",
    "content": "package cart\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"cart\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/checkout/checkout_client.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() checkoutservice.Client\n\tService() string\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := checkoutservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient checkoutservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() checkoutservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\treturn c.kitexClient.Checkout(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/checkout/checkout_default.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Checkout(ctx context.Context, req *checkout.CheckoutReq, callOptions ...callopt.Option) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = defaultClient.Checkout(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Checkout call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/checkout/checkout_init.go",
    "content": "package checkout\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"checkout\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/email/email_client.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() emailservice.Client\n\tService() string\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := emailservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient emailservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() emailservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\treturn c.kitexClient.Send(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/email/email_default.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Send(ctx context.Context, req *email.EmailReq, callOptions ...callopt.Option) (resp *email.EmailResp, err error) {\n\tresp, err = defaultClient.Send(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Send call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/email/email_init.go",
    "content": "package email\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"email\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/order/order_client.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() orderservice.Client\n\tService() string\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := orderservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient orderservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() orderservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\treturn c.kitexClient.PlaceOrder(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\treturn c.kitexClient.ListOrder(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/order/order_default.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc PlaceOrder(ctx context.Context, req *order.PlaceOrderReq, callOptions ...callopt.Option) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = defaultClient.PlaceOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"PlaceOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc ListOrder(ctx context.Context, req *order.ListOrderReq, callOptions ...callopt.Option) (resp *order.ListOrderResp, err error) {\n\tresp, err = defaultClient.ListOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/order/order_init.go",
    "content": "package order\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"order\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/payment/payment_client.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() paymentservice.Client\n\tService() string\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := paymentservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient paymentservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() paymentservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\treturn c.kitexClient.Charge(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/payment/payment_default.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Charge(ctx context.Context, req *payment.ChargeReq, callOptions ...callopt.Option) (resp *payment.ChargeResp, err error) {\n\tresp, err = defaultClient.Charge(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Charge call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/payment/payment_init.go",
    "content": "package payment\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"payment\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/product/product_client.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() productcatalogservice.Client\n\tService() string\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := productcatalogservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient productcatalogservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() productcatalogservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\treturn c.kitexClient.ListProducts(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\treturn c.kitexClient.GetProduct(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\treturn c.kitexClient.SearchProducts(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/product/product_default.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (resp *product.ListProductsResp, err error) {\n\tresp, err = defaultClient.ListProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (resp *product.GetProductResp, err error) {\n\tresp, err = defaultClient.GetProduct(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetProduct call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc SearchProducts(ctx context.Context, req *product.SearchProductsReq, callOptions ...callopt.Option) (resp *product.SearchProductsResp, err error) {\n\tresp, err = defaultClient.SearchProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"SearchProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/product/product_init.go",
    "content": "package product\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"product\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch15/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/.gitignore",
    "content": "app/*/log\napp/*/tmp\napp/*/.env\ngo.work.sum"
  },
  {
    "path": "gomall/tutorial/ch16/Makefile",
    "content": "export ROOT_MOD=github.com/cloudwego/biz-demo/gomall\n.PHONY: gen-demo-proto\ngen-demo-proto:\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift:\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix:\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend:\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl ../../idl/frontend/order_page.proto\n\n.PHONY: gen-user\ngen-user: \n\t@cd rpc_gen && cwgo client --type RPC --service user --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/user.proto\n\t@cd app/user && cwgo server --type RPC --service user --module ${ROOT_MOD}/app/user --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/user.proto\n\n.PHONY: gen-product\ngen-product: \n\t@cd rpc_gen && cwgo client --type RPC --service product --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/product.proto\n\t@cd app/product && cwgo server --type RPC --service product --module ${ROOT_MOD}/app/product --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/product.proto\n\n\n.PHONY: gen-cart\ngen-cart: \n\t@cd rpc_gen && cwgo client --type RPC --service cart --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/cart.proto\n\t@cd app/cart && cwgo server --type RPC --service cart --module ${ROOT_MOD}/app/cart --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/cart.proto\n\n\n.PHONY: gen-checkout\ngen-checkout: \n\t@cd rpc_gen && cwgo client --type RPC --service checkout --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/checkout.proto\n\t@cd app/checkout && cwgo server --type RPC --service checkout --module ${ROOT_MOD}/app/checkout --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/checkout.proto\n\n\n.PHONY: gen-payment\ngen-payment: \n\t@cd rpc_gen && cwgo client --type RPC --service payment --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/payment.proto\n\t@cd app/payment && cwgo server --type RPC --service payment --module ${ROOT_MOD}/app/payment --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/payment.proto\n\n.PHONY: gen-order\ngen-order: \n\t@cd rpc_gen && cwgo client --type RPC --service order --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/order.proto\n\t@cd app/order && cwgo server --type RPC --service order --module ${ROOT_MOD}/app/order --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/order.proto\n\n.PHONY: gen-email\ngen-email: \n\t@cd rpc_gen && cwgo client --type RPC --service email --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/email.proto\n\t@cd app/email && cwgo server --type RPC --service email --module ${ROOT_MOD}/app/email --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/email.proto\n\n.PHONY: tidy-all\ntidy-all: \n\tcd app/cart && go mod tidy\n\tcd app/checkout && go mod tidy\n\tcd app/email && go mod tidy\n\tcd app/frontend && go mod tidy\n\tcd app/order && go mod tidy\n\tcd app/payment && go mod tidy\n\tcd app/product && go mod tidy\n\tcd app/user && go mod tidy\n\tcd common && go mod tidy\n\n.PHONY: build-frontend\nbuild-frontend:\n\tdocker build -f ./deploy/Dockerfile.frontend -t frontend:${v} .\n\n.PHONY: build-svc\nbuild-svc:\n\tdocker build -f ./deploy/Dockerfile.svc -t ${svc}:${v} --build-arg SVC=${svc} .\n\n.PHONY: build-all\nbuild-all:\n\tdocker build -f ./deploy/Dockerfile.frontend -t frontend:${v} .\n\tdocker build -f ./deploy/Dockerfile.svc -t cart:${v} --build-arg SVC=cart .\n\tdocker build -f ./deploy/Dockerfile.svc -t checkout:${v} --build-arg SVC=checkout .\n\tdocker build -f ./deploy/Dockerfile.svc -t email:${v} --build-arg SVC=email .\n\tdocker build -f ./deploy/Dockerfile.svc -t order:${v} --build-arg SVC=order .\n\tdocker build -f ./deploy/Dockerfile.svc -t payment:${v} --build-arg SVC=payment .\n\tdocker build -f ./deploy/Dockerfile.svc -t product:${v} --build-arg SVC=product .\n\tdocker build -f ./deploy/Dockerfile.svc -t user:${v} --build-arg SVC=user .\n\n.PHONY: kind-load-image\nkind-load-image:\n\tkind load docker-image --name gomall-dev \\\n\tfrontend:${v} cart:${v} checkout:${v} email:${v} order:${v} payment:${v} product:${v} user:${v}"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\t//nolint:errcheck\n\t\tDB.AutoMigrate(\n\t\t\t&model.Cart{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/model/cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Cart struct {\n\tBase\n\tUserId    uint32 `json:\"user_id\"`\n\tProductId uint32 `json:\"product_id\"`\n\tQty       uint32 `json:\"qty\"`\n}\n\nfunc (c Cart) TableName() string {\n\treturn \"cart\"\n}\n\nfunc GetCartByUserId(db *gorm.DB, ctx context.Context, userId uint32) (cartList []*Cart, err error) {\n\terr = db.Debug().WithContext(ctx).Model(&Cart{}).Find(&cartList, \"user_id = ?\", userId).Error\n\treturn cartList, err\n}\n\nfunc AddCart(db *gorm.DB, ctx context.Context, c *Cart) error {\n\tvar find Cart\n\terr := db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).First(&find).Error\n\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\treturn err\n\t}\n\tif find.ID != 0 {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).UpdateColumn(\"qty\", gorm.Expr(\"qty+?\", c.Qty)).Error\n\t} else {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Create(c).Error\n\t}\n\treturn err\n}\n\nfunc EmptyCart(db *gorm.DB, ctx context.Context, userId uint32) error {\n\tif userId == 0 {\n\t\treturn errors.New(\"user_is is required\")\n\t}\n\treturn db.WithContext(ctx).Delete(&Cart{}, \"user_id = ?\", userId).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/model/cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/service/add_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype AddItemService struct {\n\tctx context.Context\n} // NewAddItemService new AddItemService\nfunc NewAddItemService(ctx context.Context) *AddItemService {\n\treturn &AddItemService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *AddItemService) Run(req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\t// Finish your business logic.\n\tgetProduct, err := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: req.Item.GetProductId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif getProduct.Product == nil || getProduct.Product.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40004, \"product not exist\")\n\t}\n\n\terr = model.AddCart(mysql.DB, s.ctx, &model.Cart{\n\t\tUserId:    req.UserId,\n\t\tProductId: req.Item.ProductId,\n\t\tQty:       uint32(req.Item.Quantity),\n\t})\n\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\n\treturn &cart.AddItemResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/service/add_item_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestAddItem_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/service/empty_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype EmptyCartService struct {\n\tctx context.Context\n} // NewEmptyCartService new EmptyCartService\nfunc NewEmptyCartService(ctx context.Context) *EmptyCartService {\n\treturn &EmptyCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EmptyCartService) Run(req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\t// Finish your business logic.\n\terr = model.EmptyCart(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn &cart.EmptyCartResp{}, kerrors.NewBizStatusError(50001, \"empty cart error\")\n\t}\n\n\treturn &cart.EmptyCartResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/service/empty_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestEmptyCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetCartService struct {\n\tctx context.Context\n} // NewGetCartService new GetCartService\nfunc NewGetCartService(ctx context.Context) *GetCartService {\n\treturn &GetCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetCartService) Run(req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\t// resp = &cart.Cart{}\n\t// Finish your business logic.\n\tcarts, err := model.GetCartByUserId(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\tvar items []*cart.CartItem\n\tfor _, v := range carts {\n\t\titems = append(items, &cart.CartItem{ProductId: v.ProductId, Quantity: int32(v.Qty)})\n\t}\n\n\treturn &cart.GetCartResp{Cart: &cart.Cart{UserId: req.GetUserId(), Items: items}}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/biz/service/get_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cart\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/cart\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.18.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/service\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\n// CartServiceImpl implements the last service interface defined in the IDL.\ntype CartServiceImpl struct{}\n\n// AddItem implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) AddItem(ctx context.Context, req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\tresp, err = service.NewAddItemService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) GetCart(ctx context.Context, req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\tresp, err = service.NewGetCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// EmptyCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) EmptyCart(ctx context.Context, req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = service.NewEmptyCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\tcartutils \"github.com/cloudwego/biz-demo/gomall/app/cart/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tProductClient productcatalogservice.Client\n\tonce          sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitProductClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcartutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: conf.GetConf().Kitex.Service,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcartutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'cart'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\trpc.InitClient()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := cartservice.NewServer(new(CartServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/cart\"\nexec \"$CURDIR/bin/cart\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/script/cart.sql",
    "content": "create table cart\n(\n    id         int auto_increment,\n    user_id    int      not null,\n    product_id int      not null,\n    qty        int      not null,\n    created_at datetime not null default current_timestamp,\n    updated_at datetime not null default current_timestamp on update current_timestamp,\n    constraint cart_pk primary key (id)\n);"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/cart/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\ntype CheckoutService struct {\n\tctx context.Context\n} // NewCheckoutService new CheckoutService\nfunc NewCheckoutService(ctx context.Context) *CheckoutService {\n\treturn &CheckoutService{ctx: ctx}\n}\n\n/*\n\tRun\n\n1. get cart\n2. calculate cart\n3. create order\n4. empty cart\n5. pay\n6. change order result\n7. finish\n*/\nfunc (s *CheckoutService) Run(req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\t// Finish your business logic.\n\t// Idempotent\n\t// get cart\n\tcartResult, err := rpc.CartClient.GetCart(s.ctx, &cart.GetCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\tklog.Error(err)\n\t\terr = fmt.Errorf(\"GetCart.err:%v\", err)\n\t\treturn\n\t}\n\tif cartResult == nil || cartResult.Cart == nil || len(cartResult.Cart.Items) == 0 {\n\t\terr = errors.New(\"cart is empty\")\n\t\treturn\n\t}\n\tvar (\n\t\toi    []*order.OrderItem\n\t\ttotal float32\n\t)\n\tfor _, cartItem := range cartResult.Cart.Items {\n\t\tproductResp, resultErr := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: cartItem.ProductId})\n\t\tif resultErr != nil {\n\t\t\tklog.Error(resultErr)\n\t\t\terr = resultErr\n\t\t\treturn\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\tcost := p.Price * float32(cartItem.Quantity)\n\t\ttotal += cost\n\t\toi = append(oi, &order.OrderItem{\n\t\t\tItem: &cart.CartItem{ProductId: cartItem.ProductId, Quantity: cartItem.Quantity},\n\t\t\tCost: cost,\n\t\t})\n\t}\n\t// create order\n\torderReq := &order.PlaceOrderReq{\n\t\tUserId:       req.UserId,\n\t\tUserCurrency: \"USD\",\n\t\tOrderItems:   oi,\n\t\tEmail:        req.Email,\n\t}\n\tif req.Address != nil {\n\t\taddr := req.Address\n\t\tzipCodeInt, _ := strconv.Atoi(addr.ZipCode)\n\t\torderReq.Address = &order.Address{\n\t\t\tStreetAddress: addr.StreetAddress,\n\t\t\tCity:          addr.City,\n\t\t\tCountry:       addr.Country,\n\t\t\tState:         addr.State,\n\t\t\tZipCode:       int32(zipCodeInt),\n\t\t}\n\t}\n\torderResult, err := rpc.OrderClient.PlaceOrder(s.ctx, orderReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"PlaceOrder.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(\"orderResult\", orderResult)\n\t// empty cart\n\temptyResult, err := rpc.CartClient.EmptyCart(s.ctx, &cart.EmptyCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\terr = fmt.Errorf(\"EmptyCart.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(emptyResult)\n\t// charge\n\tvar orderId string\n\tif orderResult != nil || orderResult.Order != nil {\n\t\torderId = orderResult.Order.OrderId\n\t}\n\tpayReq := &payment.ChargeReq{\n\t\tUserId:  req.UserId,\n\t\tOrderId: orderId,\n\t\tAmount:  total,\n\t\tCreditCard: &payment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CreditCard.CreditCardNumber,\n\t\t\tCreditCardExpirationYear:  req.CreditCard.CreditCardExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.CreditCard.CreditCardExpirationMonth,\n\t\t\tCreditCardCvv:             req.CreditCard.CreditCardCvv,\n\t\t},\n\t}\n\tpaymentResult, err := rpc.PaymentClient.Charge(s.ctx, payReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"Charge.err:%v\", err)\n\t\treturn\n\t}\n\tdata, _ := proto.Marshal(&email.EmailReq{\n\t\tFrom:        \"from@example.com\",\n\t\tTo:          req.Email,\n\t\tContentType: \"text/plain\",\n\t\tSubject:     \"You just created an order in CloudWeGo shop\",\n\t\tContent:     \"You just created an order in CloudWeGo shop\",\n\t})\n\tmsg := &nats.Msg{Subject: \"email\", Data: data}\n\t_ = mq.Nc.PublishMsg(msg)\n\n\tklog.Info(paymentResult)\n\t// change order state\n\tklog.Info(orderResult)\n\n\tresp = &checkout.CheckoutResp{\n\t\tOrderId:       orderId,\n\t\tTransactionId: paymentResult.TransactionId,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/biz/service/checkout_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCheckout_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"checkout\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n\tNats     Nats     `yaml:\"nats\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\ntype Nats struct {\n\tAddress string `yaml:\"address\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n\nnats:\n  address: \"nats://127.0.0.1:4222\""
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n\nnats:\n  address: \"nats://127.0.0.1:4222\""
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n\nnats:\n  address: \"nats://127.0.0.1:4222\""
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/checkout\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.31.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 // indirect\n\tgithub.com/klauspost/compress v1.17.4 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.7 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.18.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=\ngithub.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E=\ngithub.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8=\ngithub.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=\ngithub.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/service\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n)\n\n// CheckoutServiceImpl implements the last service interface defined in the IDL.\ntype CheckoutServiceImpl struct{}\n\n// PlaceOrder implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) PlaceOrder(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Checkout implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) Checkout(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(conf.GetConf().Nats.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\tcheckoututils \"github.com/cloudwego/biz-demo/gomall/app/checkout/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tCartClient    cartservice.Client\n\tProductClient productcatalogservice.Client\n\tPaymentClient paymentservice.Client\n\tOrderClient   orderservice.Client\n\n\tonce        sync.Once\n\terr         error\n\tserviceName = conf.GetConf().Kitex.Service\n)\n\nvar commonOpts []client.Option\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitCartClient()\n\t\tinitProductClient()\n\t\tinitPaymentClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\t\tCurrentServiceName: serviceName,\n\t\t\tTracerProvider:     mtl.TracerProvider,\n\t\t}),\n\t)\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: serviceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t)\n\topts = append(opts, commonOpts...)\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initPaymentClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: serviceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts, client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}), client.WithTransportProtocol(transport.GRPC), client.WithMetaHandler(transmeta.ClientHTTP2Handler))\n\topts = append(opts, commonOpts...)\n\tPaymentClient, err = paymentservice.NewClient(\"payment\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: serviceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts, client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}), client.WithTransportProtocol(transport.GRPC), client.WithMetaHandler(transmeta.ClientHTTP2Handler))\n\topts = append(opts, commonOpts...)\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'checkout'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\trpc.InitClient()\n\tmq.Init()\n\n\topts := kitexInit()\n\n\tsvr := checkoutservice.NewServer(new(CheckoutServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tklog.SetLevel(conf.LogLevel())\n\tklog.SetOutput(os.Stdout)\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/checkout\"\nexec \"$CURDIR/bin/checkout\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/checkout/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/biz/consumer/consumer.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage consumer\n\nimport \"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer/email\"\n\nfunc Init() {\n\temail.ConsumerInit()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/biz/consumer/email/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/notify\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc ConsumerInit() {\n\t// Connect to a server\n\n\tsub, err := mq.Nc.Subscribe(\"email\", func(m *nats.Msg) {\n\t\tvar req email.EmailReq\n\t\terr := proto.Unmarshal(m.Data, &req)\n\t\tif err != nil {\n\t\t\tklog.Error(err)\n\t\t}\n\t\tnoopEmail := notify.NewNoopEmail()\n\t\t_ = noopEmail.Send(&req)\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tserver.RegisterShutdownHook(func() {\n\t\tsub.Unsubscribe() //nolint:errcheck\n\t\tmq.Nc.Close()\n\t})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/biz/consumer/email/email_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nfunc TestEmailConsumer(t *testing.T) {\n\t// Connect to a server\n\tnc, _ := nats.Connect(nats.DefaultURL)\n\tdefer nc.Close()\n\n\tdata, err := proto.Marshal(&email.EmailReq{\n\t\tFrom:        \"hello@example.com\",\n\t\tTo:          \"to@example.com\",\n\t\tContentType: \"text/plain\",\n\t\tSubject:     \"hello world\",\n\t\tContent:     \"hello world\",\n\t})\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\terr = nc.PublishMsg(&nats.Msg{Subject: \"email\", Data: data})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/biz/service/send.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\ntype SendService struct {\n\tctx context.Context\n} // NewSendService new SendService\nfunc NewSendService(ctx context.Context) *SendService {\n\treturn &SendService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SendService) Run(req *email.EmailReq) (resp *email.EmailResp, err error) {\n\t// Finish your business logic.\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/biz/service/send_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc TestSend_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewSendService(ctx)\n\t// init req and assert value\n\n\treq := &email.EmailReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"email\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n\tNats     Nats     `yaml:\"nats\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\ntype Nats struct {\n\tAddress string `yaml:\"address\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n\nnats:\n  address: \"nats://127.0.0.1:4222\""
  },
  {
    "path": "gomall/tutorial/ch16/app/email/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n\nnats:\n  address: \"nats://127.0.0.1:4222\""
  },
  {
    "path": "gomall/tutorial/ch16/app/email/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n\nnats:\n  address: \"nats://127.0.0.1:4222\""
  },
  {
    "path": "gomall/tutorial/ch16/app/email/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/email\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.31.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/compress v1.17.4 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.7 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=\ngithub.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E=\ngithub.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8=\ngithub.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=\ngithub.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/service\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\n// EmailServiceImpl implements the last service interface defined in the IDL.\ntype EmailServiceImpl struct{}\n\n// Send implements the EmailServiceImpl interface.\nfunc (s *EmailServiceImpl) Send(ctx context.Context, req *email.EmailReq) (resp *email.EmailResp, err error) {\n\tresp, err = service.NewSendService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(conf.GetConf().Nats.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/infra/notify/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage notify\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/kr/pretty\"\n)\n\ntype NoopEmail struct{}\n\nfunc (e *NoopEmail) Send(req *email.EmailReq) error {\n\tpretty.Printf(\"%v\\n\", req)\n\treturn nil\n}\n\nfunc NewNoopEmail() NoopEmail {\n\treturn NoopEmail{}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'email'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tmq.Init()\n\tconsumer.Init()\n\tsvr := emailservice.NewServer(new(EmailServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/email/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/email\"\nexec \"$CURDIR/bin/email\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(resp))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect := \"/\"\n\n\tc.Redirect(consts.StatusFound, []byte(redirect))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/cart/cart_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// AddCartItem .\n// @router /cart [POST]\nfunc AddCartItem(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req cart.AddCartReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\t_, err = service.NewAddCartItemService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(\"/cart\"))\n}\n\n// GetCart .\n// @router /cart [GET]\nfunc GetCart(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetCartService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/cart/cart_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestAddCartItem(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/cart\", AddCartItem)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestGetCart(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/cart\", GetCart)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/category/category_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Category .\n// @router /category/:category [GET]\nfunc Category(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req category.CategoryReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewCategoryService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"category\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/category/category_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCategory(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/category/:category\", Category)\n\tpath := \"/category/:category\"                             // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/checkout/checkout_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Checkout .\n// @router /checkout [GET]\nfunc Checkout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutWaiting .\n// @router /checkout/waiting [POST]\nfunc CheckoutWaiting(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutWaitingService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutResult .\n// @router /checkout/result [GET]\nfunc CheckoutResult(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutResultService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"result\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/checkout/checkout_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCheckout(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout\", Checkout)\n\tpath := \"/checkout\"                                       // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutWaiting(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/checkout/waiting\", CheckoutWaiting)\n\tpath := \"/checkout/waiting\"                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutResult(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout/result\", CheckoutResult)\n\tpath := \"/checkout/result\"                                // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t// resp, err :=\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/order/order_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// OrderList .\n// @router /order [GET]\nfunc OrderList(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewOrderListService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"order\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"order\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/order/order_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestOrderList(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/order\", OrderList)\n\tpath := \"/order\"                                          // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/product/product_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetProduct .\n// @router /product [GET]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.ProductReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetProductService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"product\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/handler/product/product_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetProduct(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/product\", GetProduct)\n\tpath := \"/product\"                                        // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/cart/cart_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.POST(\"/cart\", append(_addcartitemMw(), cart.AddCartItem)...)\n\troot.GET(\"/cart\", append(_getcartMw(), cart.GetCart)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/cart/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage cart\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n\n}\n\nfunc _addcartitemMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getcartMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/category/category_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage category\n\nimport (\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/category\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_category := root.Group(\"/category\", _categoryMw()...)\n\t\t_category.GET(\"/:category\", append(_category0Mw(), category.Category)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/category/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage category\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _categoryMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _category0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/checkout/checkout_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/checkout\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/checkout\", append(_checkout0Mw(), checkout.Checkout)...)\n\t_checkout := root.Group(\"/checkout\", _checkoutMw()...)\n\t_checkout.GET(\"/result\", append(_checkoutresultMw(), checkout.CheckoutResult)...)\n\t_checkout.POST(\"/waiting\", append(_checkoutwaitingMw(), checkout.CheckoutWaiting)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/checkout/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage checkout\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkout0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutresultMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutwaitingMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/order/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage order\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _orderlistMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/order/order_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage order\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/order\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/order\", append(_orderlistMw(), order.OrderList)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/product/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage product\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getproductMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/product/product_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage product\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/product\", append(_getproductMw(), product.GetProduct)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/cart\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/category\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/checkout\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/order\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\torder.Register(r)\n\n\tcheckout.Register(r)\n\n\tcart.Register(r)\n\n\tproduct.Register(r)\n\n\tcategory.Register(r)\n\n\tauth.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/add_cart_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype AddCartItemService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewAddCartItemService(Context context.Context, RequestContext *app.RequestContext) *AddCartItemService {\n\treturn &AddCartItemService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *AddCartItemService) Run(req *cart.AddCartReq) (resp *common.Empty, err error) {\n\t_, err = rpc.CartClient.AddItem(h.Context, &rpccart.AddItemReq{\n\t\tUserId: frontendutils.GetUserIdFromCtx(h.Context),\n\t\tItem: &rpccart.CartItem{\n\t\t\tProductId: req.ProductId,\n\t\t\tQuantity:  req.ProductNum,\n\t\t},\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CategoryService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCategoryService(Context context.Context, RequestContext *app.RequestContext) *CategoryService {\n\treturn &CategoryService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CategoryService) Run(req *category.CategoryReq) (resp map[string]any, err error) {\n\tp, _ := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{CategoryName: req.Category})\n\treturn utils.H{\n\t\t\"title\":    \"Category\",\n\t\t\"items\":    p.Products,\n\t\t\"cart_num\": 10,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutService(Context context.Context, RequestContext *app.RequestContext) *CheckoutService {\n\treturn &CheckoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.ProductId})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":    p.Name,\n\t\t\t\"Price\":   strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\": p.Picture,\n\t\t\t\"Qty\":     strconv.Itoa(int(v.Quantity)),\n\t\t})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"Checkout\",\n\t\t\"items\":    items,\n\t\t\"cart_num\": len(items),\n\t\t\"total\":    strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/checkout_result.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype CheckoutResultService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutResultService(Context context.Context, RequestContext *app.RequestContext) *CheckoutResultService {\n\treturn &CheckoutResultService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutResultService) Run(req *common.Empty) (resp map[string]any, err error) {\n\treturn utils.H{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/checkout_waiting.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\trpcpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutWaitingService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutWaitingService(Context context.Context, RequestContext *app.RequestContext) *CheckoutWaitingService {\n\treturn &CheckoutWaitingService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutWaitingService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\t_, err = rpc.CheckoutClient.Checkout(h.Context, &rpccheckout.CheckoutReq{\n\t\tUserId:    userId,\n\t\tEmail:     req.Email,\n\t\tFirstname: req.Firstname,\n\t\tLastname:  req.Lastname,\n\t\tAddress: &rpccheckout.Address{\n\t\t\tCountry:       req.Country,\n\t\t\tZipCode:       req.Zipcode,\n\t\t\tCity:          req.City,\n\t\t\tState:         req.Province,\n\t\t\tStreetAddress: req.Street,\n\t\t},\n\t\tCreditCard: &rpcpayment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CardNum,\n\t\t\tCreditCardExpirationYear:  req.ExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.ExpirationMonth,\n\t\t\tCreditCardCvv:             req.Cvv,\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"waiting\",\n\t\t\"redirect\": \"/checkout/result\",\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetCartService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetCartService(Context context.Context, RequestContext *app.RequestContext) *GetCartService {\n\treturn &GetCartService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetCartService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{\n\t\tUserId: uint32(h.Context.Value(frontendutils.UserIdKey).(float64)),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.GetProductId()})\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\"Name\": p.Name, \"Description\": p.Description, \"Picture\": p.Picture, \"Price\": strconv.FormatFloat(float64(p.Price), 'f', 2, 64), \"Qty\": strconv.Itoa(int(v.Quantity))})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Cart\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetProductService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetProductService(Context context.Context, RequestContext *app.RequestContext) *GetProductService {\n\treturn &GetProductService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetProductService) Run(req *product.ProductReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: req.GetId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"item\": p.Product,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (res map[string]any, err error) {\n\tctx := h.Context\n\tp, err := rpc.ProductClient.ListProducts(ctx, &product.ListProductsReq{})\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n\tvar cartNum int\n\treturn utils.H{\n\t\t\"title\":    \"Hot sale\",\n\t\t\"cart_num\": cartNum,\n\t\t\"items\":    p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (resp string, err error) {\n\tres, err := rpc.UserClient.Login(h.Context, &rpcuser.LoginReq{Email: req.Email, Password: req.Password})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\tfrontendutils.MustHandleError(err)\n\tredirect := \"/\"\n\tif frontendutils.ValidateNext(req.Next) {\n\t\tredirect = req.Next\n\t}\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn redirect, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\tsession.Save() //nolint:errcheck\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/order_list.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/types\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcorder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype OrderListService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewOrderListService(Context context.Context, RequestContext *app.RequestContext) *OrderListService {\n\treturn &OrderListService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *OrderListService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\tvar orders []*types.Order\n\tlistOrderResp, err := rpc.OrderClient.ListOrder(h.Context, &rpcorder.ListOrderReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif listOrderResp == nil || len(listOrderResp.Orders) == 0 {\n\t\treturn utils.H{\n\t\t\t\"title\":  \"Order\",\n\t\t\t\"orders\": orders,\n\t\t}, nil\n\t}\n\n\tfor _, v := range listOrderResp.Orders {\n\t\tvar items []types.OrderItem\n\t\tvar total float32\n\t\tif len(v.OrderItems) > 0 {\n\t\t\tfor _, vv := range v.OrderItems {\n\t\t\t\ttotal += vv.Cost\n\t\t\t\ti := vv.Item\n\t\t\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: i.ProductId})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif productResp.Product == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tp := productResp.Product\n\t\t\t\titems = append(items, types.OrderItem{\n\t\t\t\t\tProductId:   i.ProductId,\n\t\t\t\t\tQty:         uint32(i.Quantity),\n\t\t\t\t\tProductName: p.Name,\n\t\t\t\t\tPicture:     p.Picture,\n\t\t\t\t\tCost:        vv.Cost,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\ttimeObj := time.Unix(int64(v.CreatedAt), 0)\n\t\torders = append(orders, &types.Order{\n\t\t\tCost:        total,\n\t\t\tItems:       items,\n\t\t\tCreatedDate: timeObj.Format(\"2006-01-02 15:04:05\"),\n\t\t\tOrderId:     v.OrderId,\n\t\t\tConsignee:   types.Consignee{Email: v.Email},\n\t\t})\n\t}\n\n\treturn utils.H{\n\t\t\"title\":  \"Order\",\n\t\t\"orders\": orders,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\tres, err := rpc.UserClient.Register(h.Context, &rpcuser.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tConfirmPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tvar cartNum int\n\tuserId := frontendutils.GetUserIdFromCtx(ctx)\n\tcartResp, _ := rpc.CartClient.GetCart(ctx, &cart.GetCartReq{UserId: userId})\n\tif cartResp != nil && cartResp.Cart != nil {\n\t\tcartNum = len(cartResp.Cart.Items)\n\t}\n\tcontent[\"user_id\"] = ctx.Value(frontendutils.UserIdKey)\n\tcontent[\"cart_num\"] = cartNum\n\treturn content\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     int    `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.21.5\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.7.3\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/hashicorp/consul/api v1.26.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b\n\tgithub.com/hertz-contrib/logger/zap v1.1.0\n\tgithub.com/hertz-contrib/monitor-prometheus v0.1.2\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3\n\tgithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1\n\tgithub.com/hertz-contrib/pprof v0.1.1\n\tgithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/prometheus/client_golang v1.18.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.opentelemetry.io/otel v1.21.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.21.0\n\tgo.opentelemetry.io/otel/trace v1.21.0\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/andeya/ameda v1.5.3 // indirect\n\tgithub.com/andeya/goutil v1.0.1 // indirect\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.11 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.7.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.3.0 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.19.0 // indirect\n\tgolang.org/x/sync v0.5.0 // indirect\n\tgolang.org/x/sys v0.16.0 // indirect\n\tgolang.org/x/text v0.14.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/andeya/ameda v1.5.3 h1:SvqnhQPZwwabS8HQTRGfJwWPl2w9ZIPInHAw9aE1Wlk=\ngithub.com/andeya/ameda v1.5.3/go.mod h1:FQDHRe1I995v6GG+8aJ7UIUToEmbdTJn/U26NCPIgXQ=\ngithub.com/andeya/goutil v1.0.1 h1:eiYwVyAnnK0dXU5FJsNjExkJW4exUGn/xefPt3k4eXg=\ngithub.com/andeya/goutil v1.0.1/go.mod h1:jEG5/QnnhG7yGxwFUX6Q+JGMif7sjdHmmNVjn7nhJDo=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11 h1:jJgmoDKPKacGl0llPYbYL/+/2N+Ng0vV0ipbnVssXHY=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11/go.mod h1:UAyKh4ZRLBPGsyTRFZoPqTni1TlojMdOJXQnEIPCX84=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.3.5/go.mod h1:V973WhNhGmvHxW6nQmsHEfHaoU9F3zTF+93rH03hcUQ=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/hertz v0.3.2/go.mod h1:hnv3B7eZ6kMv7CKFHT2OC4LU0mA4s5XPyu/SbixLcrU=\ngithub.com/cloudwego/hertz v0.6.0/go.mod h1:83EedHQvCXpveYh2r9us8YlQ1C28vPg93wPdB/QpJiA=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.2.6/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=\ngithub.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.15.0/go.mod h1:v6nvB10borjOuIwNRZYPZiHKrTM/AyrGtd0WVVodKM8=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.11.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b h1:RoBp+TurP+46VZl31VMV+6wO2SlNlXwyVwjc93s5/tI=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/zap v1.1.0 h1:4efINiIDJrXEtAFeEdDJvc3Hye0VFxp+0X4BwaZgxNs=\ngithub.com/hertz-contrib/logger/zap v1.1.0/go.mod h1:D/rJJgsYn+SGaHVfVqWS3vHTbbc7ODAlJO+6smWgTeE=\ngithub.com/hertz-contrib/monitor-prometheus v0.1.2 h1:MYZGi4uStLtHKUm7+kc/ljbxzUTDE9H5FPCTSB/p7ZM=\ngithub.com/hertz-contrib/monitor-prometheus v0.1.2/go.mod h1:aUP6t5bK8msuf+5dN/k8099IjD0u8s9A6vrYWQ+yzN0=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1 h1:N/rbPCZgrupBNjTEe8Cq+cnTOpgj/y4SU6MYe6uQl0g=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1/go.mod h1:oEnsG4CpBuLx1vcCnxpE/MsNHUrF4qQKw8DiOdtdBa0=\ngithub.com/hertz-contrib/pprof v0.1.1 h1:x7kOFUtqkveXbDbiISIFE3x02cAtcb6/DBjHgsJmYcM=\ngithub.com/hertz-contrib/pprof v0.1.1/go.mod h1:9g23VQrcC4AjW++VA2relquyMXPVfs/s+t5FBIjIIOs=\ngithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b h1:DIfogbZyBmOYUkkS0jGDNT03jqVPtHypQrZ0mhcASUE=\ngithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b/go.mod h1:bjNZ+0osz/GmRMEXZAMeme+qE7WV6g4DEtX/TdfXzvo=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/nyaruka/phonenumbers v1.3.0 h1:IFyyJfF2Elg8xGKFghWrRXzb6qAHk+Q3uPqmIgS20JQ=\ngithub.com/nyaruka/phonenumbers v1.3.0/go.mod h1:4jyKp/BFUokLbCHyoZag+T3S1KezFVoEKtgnbpzItC4=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=\ngolang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=\ngolang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=\ngolang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50732,\n\t\tName:          \"api.service_path\",\n\t\tTag:           \"bytes,50732,opt,name=service_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is\n\t// generated, with a higher priority than api_version\n\t//\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the\n\t// client code is generated\n\t//\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n\t// optional string service_path = 50732;\n\tE_ServicePath = &file_api_proto_extTypes[37]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[38]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x47, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xac, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a,\n\t0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t3,  // 37: api.service_path:extendee -> google.protobuf.ServiceOptions\n\t4,  // 38: api.reserve:extendee -> google.protobuf.MessageOptions\n\t39, // [39:39] is the sub-list for method output_type\n\t39, // [39:39] is the sub-list for method input_type\n\t39, // [39:39] is the sub-list for extension type_name\n\t0,  // [0:39] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 39,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\" form:\"confirm_password\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52,\n\t0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a,\n\t0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb, 0x18, 0x10, 0x63, 0x6f, 0x6e,\n\t0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x73,\n\t0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2,\n\t0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x04, 0x6e,\n\t0x65, 0x78, 0x74, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12,\n\t0x1a, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e,\n\t0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x22, 0x12, 0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72,\n\t0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x12, 0x17, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0f, 0xd2, 0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x4b,\n\t0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: frontend.auth.RegisterReq\n\t(*LoginReq)(nil),     // 1: frontend.auth.LoginReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t1, // 1: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/hertz_gen/frontend/cart/cart_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: cart_page.proto\n\npackage cart\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AddCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId  uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\" form:\"productId\"`\n\tProductNum int32  `protobuf:\"varint,2,opt,name=product_num,json=productNum,proto3\" json:\"product_num,omitempty\" form:\"productNum\"`\n}\n\nfunc (x *AddCartReq) Reset() {\n\t*x = AddCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddCartReq) ProtoMessage() {}\n\nfunc (x *AddCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddCartReq.ProtoReflect.Descriptor instead.\nfunc (*AddCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AddCartReq) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *AddCartReq) GetProductNum() int32 {\n\tif x != nil {\n\t\treturn x.ProductNum\n\t}\n\treturn 0\n}\n\nvar File_cart_page_proto protoreflect.FileDescriptor\n\nvar file_cart_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x6b, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71,\n\t0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x42, 0x0d, 0xe2, 0xbb, 0x18, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x49, 0x64, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x2f,\n\t0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x05, 0x42, 0x0e, 0xe2, 0xbb, 0x18, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x4e, 0x75, 0x6d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x32,\n\t0xa0, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x4b, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x19,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x09, 0xd2, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,\n\t0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x09, 0xca, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61,\n\t0x72, 0x74, 0x42, 0x4b, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64,\n\t0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_page_proto_rawDescOnce sync.Once\n\tfile_cart_page_proto_rawDescData = file_cart_page_proto_rawDesc\n)\n\nfunc file_cart_page_proto_rawDescGZIP() []byte {\n\tfile_cart_page_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_page_proto_rawDescData)\n\t})\n\treturn file_cart_page_proto_rawDescData\n}\n\nvar file_cart_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_cart_page_proto_goTypes = []interface{}{\n\t(*AddCartReq)(nil),   // 0: frontend.cart.AddCartReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_cart_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.cart.CartService.AddCartItem:input_type -> frontend.cart.AddCartReq\n\t1, // 1: frontend.cart.CartService.GetCart:input_type -> frontend.common.Empty\n\t1, // 2: frontend.cart.CartService.AddCartItem:output_type -> frontend.common.Empty\n\t1, // 3: frontend.cart.CartService.GetCart:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_page_proto_init() }\nfunc file_cart_page_proto_init() {\n\tif File_cart_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_page_proto_goTypes,\n\t\tDependencyIndexes: file_cart_page_proto_depIdxs,\n\t\tMessageInfos:      file_cart_page_proto_msgTypes,\n\t}.Build()\n\tFile_cart_page_proto = out.File\n\tfile_cart_page_proto_rawDesc = nil\n\tfile_cart_page_proto_goTypes = nil\n\tfile_cart_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/hertz_gen/frontend/category/category_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: category_page.proto\n\npackage category\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CategoryReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory string `protobuf:\"bytes,1,opt,name=category,proto3\" json:\"category,omitempty\" path:\"category\"`\n}\n\nfunc (x *CategoryReq) Reset() {\n\t*x = CategoryReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_category_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryReq) ProtoMessage() {}\n\nfunc (x *CategoryReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_category_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryReq.ProtoReflect.Descriptor instead.\nfunc (*CategoryReq) Descriptor() ([]byte, []int) {\n\treturn file_category_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CategoryReq) GetCategory() string {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn \"\"\n}\n\nvar File_category_page_proto protoreflect.FileDescriptor\n\nvar file_category_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x08, 0x63, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xd2, 0xbb, 0x18,\n\t0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x32, 0x6e, 0x0a, 0x0f, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13,\n\t0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2f, 0x3a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x42, 0x4f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d,\n\t0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_category_page_proto_rawDescOnce sync.Once\n\tfile_category_page_proto_rawDescData = file_category_page_proto_rawDesc\n)\n\nfunc file_category_page_proto_rawDescGZIP() []byte {\n\tfile_category_page_proto_rawDescOnce.Do(func() {\n\t\tfile_category_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_category_page_proto_rawDescData)\n\t})\n\treturn file_category_page_proto_rawDescData\n}\n\nvar file_category_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_category_page_proto_goTypes = []interface{}{\n\t(*CategoryReq)(nil),  // 0: frontend.category.CategoryReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_category_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.category.CategoryService.Category:input_type -> frontend.category.CategoryReq\n\t1, // 1: frontend.category.CategoryService.Category:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_category_page_proto_init() }\nfunc file_category_page_proto_init() {\n\tif File_category_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_category_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_category_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_category_page_proto_goTypes,\n\t\tDependencyIndexes: file_category_page_proto_depIdxs,\n\t\tMessageInfos:      file_category_page_proto_msgTypes,\n\t}.Build()\n\tFile_category_page_proto = out.File\n\tfile_category_page_proto_rawDesc = nil\n\tfile_category_page_proto_goTypes = nil\n\tfile_category_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/hertz_gen/frontend/checkout/checkout_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: checkout_page.proto\n\npackage checkout\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tFirstname       string `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\" form:\"firstname\"`\n\tLastname        string `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\" form:\"lastname\"`\n\tStreet          string `protobuf:\"bytes,4,opt,name=street,proto3\" json:\"street,omitempty\" form:\"street\"`\n\tZipcode         string `protobuf:\"bytes,5,opt,name=zipcode,proto3\" json:\"zipcode,omitempty\" form:\"zipcode\"`\n\tProvince        string `protobuf:\"bytes,6,opt,name=province,proto3\" json:\"province,omitempty\" form:\"province\"`\n\tCountry         string `protobuf:\"bytes,7,opt,name=country,proto3\" json:\"country,omitempty\" form:\"country\"`\n\tCity            string `protobuf:\"bytes,8,opt,name=city,proto3\" json:\"city,omitempty\" form:\"city\"`\n\tCardNum         string `protobuf:\"bytes,9,opt,name=card_num,json=cardNum,proto3\" json:\"card_num,omitempty\" form:\"cardNum\"`\n\tExpirationMonth int32  `protobuf:\"varint,10,opt,name=expiration_month,json=expirationMonth,proto3\" json:\"expiration_month,omitempty\" form:\"expirationMonth\"`\n\tExpirationYear  int32  `protobuf:\"varint,11,opt,name=expiration_year,json=expirationYear,proto3\" json:\"expiration_year,omitempty\" form:\"expirationYear\"`\n\tCvv             int32  `protobuf:\"varint,12,opt,name=cvv,proto3\" json:\"cvv,omitempty\" form:\"cvv\"`\n\tPayment         string `protobuf:\"bytes,13,opt,name=payment,proto3\" json:\"payment,omitempty\" form:\"payment\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetStreet() string {\n\tif x != nil {\n\t\treturn x.Street\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetZipcode() string {\n\tif x != nil {\n\t\treturn x.Zipcode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCardNum() string {\n\tif x != nil {\n\t\treturn x.CardNum\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationMonth\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetCvv() int32 {\n\tif x != nil {\n\t\treturn x.Cvv\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetPayment() string {\n\tif x != nil {\n\t\treturn x.Payment\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_page_proto protoreflect.FileDescriptor\n\nvar file_checkout_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa6, 0x04, 0x0a, 0x0b, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d,\n\t0xe2, 0xbb, 0x18, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x0a, 0xe2, 0xbb, 0x18, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x52, 0x06,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x7a, 0x69, 0x70,\n\t0x63, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a,\n\t0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70,\n\t0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x63, 0x6f,\n\t0x75, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c,\n\t0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xe2, 0xbb,\n\t0x18, 0x04, 0x63, 0x69, 0x74, 0x79, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x08,\n\t0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b,\n\t0xe2, 0xbb, 0x18, 0x07, 0x63, 0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x52, 0x07, 0x63, 0x61, 0x72,\n\t0x64, 0x4e, 0x75, 0x6d, 0x12, 0x3e, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13,\n\t0xe2, 0xbb, 0x18, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f,\n\t0x6e, 0x74, 0x68, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x6f, 0x6e, 0x74, 0x68, 0x12, 0x3b, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, 0xe2,\n\t0xbb, 0x18, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x12, 0x19, 0x0a, 0x03, 0x63, 0x76, 0x76, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xe2, 0xbb, 0x18, 0x03, 0x63, 0x76, 0x76, 0x52, 0x03, 0x63, 0x76, 0x76, 0x12, 0x25, 0x0a, 0x07,\n\t0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2,\n\t0xbb, 0x18, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x32, 0x96, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x6f, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0d, 0xca, 0xc1, 0x18,\n\t0x09, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x58, 0x0a, 0x0f, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,\n\t0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0xd2,\n\t0xc1, 0x18, 0x11, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x77, 0x61, 0x69,\n\t0x74, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0xca, 0xc1, 0x18, 0x10, 0x2f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x4f, 0x5a, 0x4d,\n\t0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64,\n\t0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f,\n\t0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_page_proto_rawDescOnce sync.Once\n\tfile_checkout_page_proto_rawDescData = file_checkout_page_proto_rawDesc\n)\n\nfunc file_checkout_page_proto_rawDescGZIP() []byte {\n\tfile_checkout_page_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_page_proto_rawDescData)\n\t})\n\treturn file_checkout_page_proto_rawDescData\n}\n\nvar file_checkout_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_checkout_page_proto_goTypes = []interface{}{\n\t(*CheckoutReq)(nil),  // 0: frontend.checkout.CheckoutReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_checkout_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.checkout.CheckoutService.Checkout:input_type -> frontend.checkout.CheckoutReq\n\t1, // 1: frontend.checkout.CheckoutService.CheckoutWaiting:input_type -> frontend.common.Empty\n\t1, // 2: frontend.checkout.CheckoutService.CheckoutResult:input_type -> frontend.common.Empty\n\t1, // 3: frontend.checkout.CheckoutService.Checkout:output_type -> frontend.common.Empty\n\t1, // 4: frontend.checkout.CheckoutService.CheckoutWaiting:output_type -> frontend.common.Empty\n\t1, // 5: frontend.checkout.CheckoutService.CheckoutResult:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_page_proto_init() }\nfunc file_checkout_page_proto_init() {\n\tif File_checkout_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_page_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_page_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_page_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_page_proto = out.File\n\tfile_checkout_page_proto_rawDesc = nil\n\tfile_checkout_page_proto_goTypes = nil\n\tfile_checkout_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x09, 0x61,\n\t0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,\n\t0x4c, 0x0a, 0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d,\n\t0x0a, 0x04, 0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a,\n\t0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.common.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.common.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/hertz_gen/frontend/order/order_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: order_page.proto\n\npackage order\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_order_page_proto protoreflect.FileDescriptor\n\nvar file_order_page_proto_rawDesc = []byte{\n\t0x0a, 0x10, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x32, 0x57, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x73,\n\t0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0a, 0xca, 0xc1, 0x18, 0x06, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x4c, 0x5a,\n\t0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar file_order_page_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_order_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.order.OrderService.OrderList:input_type -> frontend.common.Empty\n\t0, // 1: frontend.order.OrderService.OrderList:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_order_page_proto_init() }\nfunc file_order_page_proto_init() {\n\tif File_order_page_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_page_proto_goTypes,\n\t\tDependencyIndexes: file_order_page_proto_depIdxs,\n\t}.Build()\n\tFile_order_page_proto = out.File\n\tfile_order_page_proto_rawDesc = nil\n\tfile_order_page_proto_goTypes = nil\n\tfile_order_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/hertz_gen/frontend/product/product_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: product_page.proto\n\npackage product\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\" query:\"id\"`\n}\n\nfunc (x *ProductReq) Reset() {\n\t*x = ProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProductReq) ProtoMessage() {}\n\nfunc (x *ProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProductReq.ProtoReflect.Descriptor instead.\nfunc (*ProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nvar File_product_page_proto protoreflect.FileDescriptor\n\nvar file_product_page_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61,\n\t0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x42, 0x06, 0xb2, 0xbb, 0x18, 0x02, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x32, 0x62,\n\t0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x50, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x22, 0x0c, 0xca, 0xc1, 0x18, 0x08, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64,\n\t0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_page_proto_rawDescOnce sync.Once\n\tfile_product_page_proto_rawDescData = file_product_page_proto_rawDesc\n)\n\nfunc file_product_page_proto_rawDescGZIP() []byte {\n\tfile_product_page_proto_rawDescOnce.Do(func() {\n\t\tfile_product_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_page_proto_rawDescData)\n\t})\n\treturn file_product_page_proto_rawDescData\n}\n\nvar file_product_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_product_page_proto_goTypes = []interface{}{\n\t(*ProductReq)(nil),   // 0: frontend.product.ProductReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_product_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.product.ProductService.GetProduct:input_type -> frontend.product.ProductReq\n\t1, // 1: frontend.product.ProductService.GetProduct:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_product_page_proto_init() }\nfunc file_product_page_proto_init() {\n\tif File_product_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_page_proto_goTypes,\n\t\tDependencyIndexes: file_product_page_proto_depIdxs,\n\t\tMessageInfos:      file_product_page_proto_msgTypes,\n\t}.Build()\n\tFile_product_page_proto = out.File\n\tfile_product_page_proto_rawDesc = nil\n\tfile_product_page_proto_goTypes = nil\n\tfile_product_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/infra/mtl/log.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/kitex/server\"\n\thertzzap \"github.com/hertz-contrib/logger/zap\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\"\n)\n\nfunc initLog() {\n\tvar opts []hertzzap.Option\n\tvar output zapcore.WriteSyncer\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\topts = append(opts, hertzzap.WithCoreEnc(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())))\n\t\toutput = os.Stdout\n\t} else {\n\t\topts = append(opts, hertzzap.WithCoreEnc(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())))\n\t\t// async log\n\t\toutput = &zapcore.BufferedWriteSyncer{\n\t\t\tWS:            zapcore.AddSync(os.Stdout),\n\t\t\tFlushInterval: time.Minute,\n\t\t}\n\t\tserver.RegisterShutdownHook(func() {\n\t\t\toutput.Sync() //nolint:errcheck\n\t\t})\n\t}\n\tlog := hertzzap.NewLogger(opts...)\n\thlog.SetLogger(log)\n\thlog.SetLevel(hlog.LevelInfo)\n\thlog.SetOutput(output)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/infra/mtl/metric.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server/registry\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/route\"\n\tconsulapi \"github.com/hashicorp/consul/api\"\n\t\"github.com/hertz-contrib/registry/consul\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/collectors\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n)\n\nvar Registry *prometheus.Registry\n\nfunc initMetric() route.CtxCallback {\n\tRegistry = prometheus.NewRegistry()\n\tRegistry.MustRegister(collectors.NewGoCollector())\n\tRegistry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))\n\tconfig := consulapi.DefaultConfig()\n\tconfig.Address = conf.GetConf().Hertz.RegistryAddr\n\tconsulClient, _ := consulapi.NewClient(config)\n\tr := consul.NewConsulRegister(consulClient, consul.WithAdditionInfo(&consul.AdditionInfo{\n\t\tTags: []string{\"service:frontend\"},\n\t}))\n\n\tlocalIp := utils.LocalIP()\n\tip, err := net.ResolveTCPAddr(\"tcp\", fmt.Sprintf(\"%s:%d\", localIp, conf.GetConf().Hertz.MetricsPort))\n\tif err != nil {\n\t\thlog.Error(err)\n\t}\n\tregistryInfo := &registry.Info{Addr: ip, ServiceName: \"prometheus\", Weight: 1}\n\terr = r.Register(registryInfo)\n\n\tif err != nil {\n\t\thlog.Error(err)\n\t}\n\n\thttp.Handle(\"/metrics\", promhttp.HandlerFor(Registry, promhttp.HandlerOpts{}))\n\tgo http.ListenAndServe(fmt.Sprintf(\":%d\", conf.GetConf().Hertz.MetricsPort), nil) //nolint:errcheck\n\treturn func(ctx context.Context) {\n\t\tr.Deregister(registryInfo) //nolint:errcheck\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/infra/mtl/mtl.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/route\"\n)\n\nvar once sync.Once\n\nvar Hooks []route.CtxCallback\n\nfunc InitMtl() {\n\tonce.Do(\n\t\tfunc() {\n\t\t\tHooks = append(Hooks, InitTracing(), initMetric())\n\t\t\tinitLog()\n\t\t},\n\t)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/infra/mtl/tracing.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/route\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.17.0\"\n)\n\nvar TracerProvider *tracesdk.TracerProvider\n\nfunc InitTracing() route.CtxCallback {\n\texporter, err := otlptracegrpc.New(context.Background())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tprocessor := tracesdk.NewBatchSpanProcessor(exporter)\n\tres, err := resource.New(context.Background(), resource.WithAttributes(semconv.ServiceNameKey.String(utils.ServiceName)))\n\tif err != nil {\n\t\tres = resource.Default()\n\t}\n\tTracerProvider = tracesdk.NewTracerProvider(tracesdk.WithSpanProcessor(processor), tracesdk.WithResource(res))\n\totel.SetTracerProvider(TracerProvider)\n\n\treturn route.CtxCallback(func(ctx context.Context) {\n\t\texporter.Shutdown(ctx) //nolint:errcheck\n\t})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/mtl\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/circuitbreak\"\n\t\"github.com/cloudwego/kitex/pkg/fallback\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tUserClient     userservice.Client\n\tProductClient  productcatalogservice.Client\n\tCartClient     cartservice.Client\n\tCheckoutClient checkoutservice.Client\n\tOrderClient    orderservice.Client\n\n\tonce sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitUserClient()\n\t\tinitProductClient()\n\t\tinitCartClient()\n\t\tinitCheckoutClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initUserClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\tUserClient, err = userservice.NewClient(\"user\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\tcbs := circuitbreak.NewCBSuite(func(ri rpcinfo.RPCInfo) string {\n\t\treturn circuitbreak.RPCInfo2Key(ri)\n\t})\n\n\tcbs.UpdateServiceCBConfig(\"shop-frontend/product/GetProduct\", circuitbreak.CBConfig{Enable: true, ErrRate: 0.5, MinSample: 2})\n\n\topts = append(opts, client.WithCircuitBreaker(cbs), client.WithFallback(fallback.NewFallbackPolicy(fallback.UnwrapHelper(func(ctx context.Context, req, resp interface{}, err error) (fbResp interface{}, fbErr error) {\n\t\tmethodName := rpcinfo.GetRPCInfo(ctx).To().Method()\n\t\tif err == nil {\n\t\t\treturn resp, err\n\t\t}\n\t\tif methodName != \"ListProducts\" {\n\t\t\treturn resp, err\n\t\t}\n\t\treturn &product.ListProductsResp{\n\t\t\tProducts: []*product.Product{\n\t\t\t\t{\n\t\t\t\t\tPrice:       6.6,\n\t\t\t\t\tId:          3,\n\t\t\t\t\tPicture:     \"/static/image/t-shirt.jpeg\",\n\t\t\t\t\tName:        \"T-Shirt\",\n\t\t\t\t\tDescription: \"CloudWeGo T-Shirt\",\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil\n\t}))))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t)\n\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCheckoutClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t)\n\tCheckoutClient, err = checkoutservice.NewClient(\"checkout\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t)\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzprom \"github.com/hertz-contrib/monitor-prometheus\"\n\thertzotelprovider \"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\thertzoteltracing \"github.com/hertz-contrib/obs-opentelemetry/tracing\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n\toteltrace \"go.opentelemetry.io/otel/trace\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMtl()\n\trpc.InitClient()\n\n\taddress := conf.GetConf().Hertz.Address\n\n\t_ = hertzotelprovider.NewOpenTelemetryProvider(\n\t\thertzotelprovider.WithSdkTracerProvider(mtl.TracerProvider),\n\t\thertzotelprovider.WithEnableMetrics(false),\n\t)\n\n\ttracer, cfg := hertzoteltracing.NewServerTracer(hertzoteltracing.WithCustomResponseHandler(func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Header(\"shop-trace-id\", oteltrace.SpanFromContext(ctx).SpanContext().TraceID().String())\n\t}))\n\n\th := server.New(server.WithHostPorts(address), server.WithTracer(hertzprom.NewServerTracer(\n\t\t\"\",\n\t\t\"\",\n\t\thertzprom.WithRegistry(mtl.Registry),\n\t\thertzprom.WithDisableServer(true),\n\t)), tracer)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Delims(\"{{\", \"}}\")\n\th.Use(hertzoteltracing.ServerMiddleware(cfg))\n\n\tregisterMiddleware(h)\n\n\trouter.GeneratedRegister(h)\n\n\th.GET(\"sign-in\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-in\", utils.H{\n\t\t\t\"title\": \"Sign in\",\n\t\t\t\"next\":  c.Query(\"next\"),\n\t\t})\n\t})\n\th.GET(\"sign-up\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", utils.H{\n\t\t\t\"title\": \"Sign up\",\n\t\t})\n\t})\n\n\th.Static(\"/static\", \"./\")\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\tstore, err := redis.NewStore(100, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tstore.Options(sessions.Options{MaxAge: 86400, Path: \"/\"})\n\trs, err := redis.GetRedisStore(store)\n\tif err == nil {\n\t\trs.SetSerializer(sessions.JSONSerializer{})\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\th.OnShutdown = append(h.OnShutdown, mtl.Hooks...)\n\n\t// cores\n\th.Use(cors.Default())\n\tmiddleware.RegisterMiddleware(h)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tbyteRef := c.GetHeader(\"Referer\")\n\t\t\tref := string(byteRef)\n\t\t\tnext := \"/sign-in\"\n\t\t\tif ref != \"\" {\n\t\t\t\tif utils.ValidateNext(ref) {\n\t\t\t\t\tnext = fmt.Sprintf(\"%s?next=%s\", next, ref)\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.Redirect(302, []byte(next))\n\t\t\tc.Abort()\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc RegisterMiddleware(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/cart-num.tmpl",
    "content": "{{define \"cart-num\"}}\n    <a href=\"/cart\" class=\"btn position-relative\">\n        <i class=\"fa-solid fa-cart-shopping\" style=\"font-size: 2rem\">\n        </i>\n        {{ if $.cart_num}}\n        <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\">\n    {{ $.cart_num }}\n            {{ end }}\n  </span>\n    </a>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/cart.tmpl",
    "content": "{{ define \"cart\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <ul class=\"list-group\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n        {{ if $.items }}\n            <div class=\"mt-3 mb-5\">\n                <div class=\"float-end\">\n                    <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                    <a href=\"/checkout\" class=\"btn btn-lg btn-success float-end\">Check out</a>\n                </div>\n            </div>\n        {{else}}\n            <h1 class=\"text-center text-danger\">Your Cart is empty</h1>\n            <div class=\"text-center\"><a href=\"/\">Shop Hot Sale</a></div>\n        {{ end }}\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/category.tmpl",
    "content": "{{ define \"category\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/checkout.tmpl",
    "content": "{{ define \"checkout\" }}\n    {{ template \"header\" . }}\n    <div class=\"row mb-5\">\n        <div class=\"col-lg-8 col-sm-12\">\n            <form method=\"post\" action=\"/checkout/waiting\">\n                <h4 class=\"mb-3 mt-3\">Contact</h4>\n                <label for=\"email\" class=\"form-label col-12\">\n                    <input class=\"form-control\" id=\"email\" type=\"email\" placeholder=\"Email\" name=\"email\"\n                           aria-label=\"email\" value=\"abc@example.com\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">Delivery</h4>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"firstname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"firstname\" class=\"form-control\" placeholder=\"First name\"\n                               name=\"firstname\" value=\"world\">\n                    </label>\n                    <label for=\"lastname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"lastname\" class=\"form-control\" placeholder=\"Last name\" name=\"lastname\"\n                               value=\"hello\">\n                    </label>\n                </div>\n                <label for=\"street\" class=\"mb-3 mt-3 col-12 form-label\">\n                    <input type=\"text\" class=\"form-control\" placeholder=\"Street\" name=\"street\" value=\"7th street\"\n                           id=\"street\">\n                </label>\n                <label for=\"zipcode\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"zipcode\" name=\"zipcode\" placeholder=\"zipcode\"\n                           value=\"310000\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"city\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"city\" class=\"form-control\" placeholder=\"City\" name=\"city\"\n                               value=\"hangzhou\">\n                    </label>\n                    <label for=\"province\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"province\" class=\"form-control\" name=\"province\" placeholder=\"Province\"\n                               value=\"zhejiang\">\n                    </label>\n                </div>\n                <label for=\"country\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"country\" name=\"country\" placeholder=\"Country\"\n                           value=\"china\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">\n                    Payment\n                </h4>\n                <label for=\"card-num\" class=\"form-label col-12\">\n                    <input type=\"text\" id=\"card-num\" class=\"form-control\" name=\"cardNum\" placeholder=\"Card number\"\n                           value=\"424242424242424242\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"expiration-month\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-month\" name=\"expirationMonth\" class=\"form-control\"\n                               placeholder=\"Expiration Month\" value=\"12\">\n                    </label>\n                    <label for=\"expiration-year\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-year\" name=\"expirationYear\" class=\"form-control\"\n                               placeholder=\"Expiration Year\" value=\"2030\">\n                    </label>\n                    <label for=\"cvv\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"cvv\" class=\"form-control\" name=\"cvv\" placeholder=\"cvv\" required>\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"card\" value=\"card\" checked>\n                    <label class=\"form-check-label\" for=\"card\">\n                        Card\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"stripe\" value=\"stripe\" disabled>\n                    <label class=\"form-check-label\" for=\"stripe\">\n                        Stripe\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"paypal\" value=\"paypal\" disabled>\n                    <label class=\"form-check-label\" for=\"paypal\">\n                        Paypal\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"wechat\" value=\"wechat\" disabled>\n                    <label class=\"form-check-label\" for=\"wechat\">\n                        Wechat\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"alipay\" value=\"alipay\" disabled>\n                    <label class=\"form-check-label\" for=\"alipay\">\n                        Alipay\n                    </label>\n                </div>\n                <div class=\"mt-3 mb-3\">\n                    <div class=\"float-end\">\n                        <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                        <input type=\"submit\" class=\"btn btn-success\" value=\"Pay\">\n                    </div>\n                </div>\n            </form>\n        </div>\n        <ul class=\"list-group col-lg-4 col-sm-12\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/footer.tmpl",
    "content": "{{ define \"footer\" }}\n\n    </div>\n    </main>\n    <footer class=\"py-5 bg-primary text-white\">\n        <div class=\"footer-top\">\n            <div class=\"container footer-social\">\n                <p>© 2023 CloudWeGo (<a class=\"text-white\"\n                                        href=\"https://github.com/cloudwego\">Source Code</a>)</p>\n            </div>\n        </div>\n    </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/js/all.min.js\"\n            integrity=\"sha512-GWzVrcGlo0TxTRvz9ttioyYJ+Wwk9Ck0G81D+eO63BaqHaJ3YZX9wuqjwgfcV/MrB2PhaVX9DkYVhbFpStnqpQ==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    </body>\n    </html>\n{{ end }}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/header.tmpl",
    "content": "{{ define \"header\" }}\n    <!DOCTYPE html>\n    <html lang=\"en\">\n\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, shrink-to-fit=no\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n        {{ if $.redirect }}\n            <meta http-equiv=\"refresh\" content=\"5;url=/checkout/result\"/>\n        {{ end}}\n        <title>\n            CloudWeGo Shop\n        </title>\n        <link rel=\"stylesheet\" href=\"/static/css/bootstrap.min.css\">\n        <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n              integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n              crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n    </head>\n\n    <body class=\"min-vh-100\">\n    <header>\n        <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n            <div class=\"container\">\n                <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\"\n                        data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"/\">\n                    <img src=\"/static/image/logo.jpg\" style=\"height: 50px\" alt=\"\"> CloudWego Shop\n                </a>\n                <div class=\" ms-lg-3 d-block d-lg-none d-xl-none\">\n                    {{ template \"cart-num\" . }}\n                </div>\n                <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                    <ul class=\"navbar-nav mb-2 mb-lg-0 w-100\">\n                        <li class=\"nav-item dropdown\">\n                            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\"\n                               aria-expanded=\"false\">\n                                Categories\n                            </a>\n                            <ul class=\"dropdown-menu\">\n                                <li><a class=\"dropdown-item\" href=\"/category/t-shirt\">T-shirt</a></li>\n                                <li><a class=\"dropdown-item\" href=\"/category/sticker\">Sticker</a></li>\n                            </ul>\n                        </li>\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link\" href=\"/about\">About</a>\n                        </li>\n                        <form class=\"d-flex ms-auto\" role=\"search\" action=\"/search\" method=\"get\">\n                            <input class=\"form-control me-2\" type=\"search\" name=\"q\" placeholder=\"Search\"\n                                   aria-label=\"Search\" value=\"{{ .q }}\">\n                            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n                        </form>\n                        {{ if .user_id }}\n                            <div class=\"nav-item dropdown ms-3\">\n                                <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\"\n                                   aria-expanded=\"false\"><i class=\"fa-solid fa-user me-2\"></i>Hello</a>\n                                <ul class=\"dropdown-menu\">\n                                    <li><a class=\"dropdown-item\" href=\"/order\">Order Center</a></li>\n                                    <li>\n                                        <hr class=\"dropdown-divider\">\n                                    </li>\n                                    <li>\n                                        <form class=\"d-flex ms-auto\" action=\"/auth/logout\" method=\"post\">\n                                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                                        </form>\n                                    </li>\n                                </ul>\n                            </div>\n                        {{ else }}\n                            <div class=\"btn-group ms-3\" role=\"group\" aria-label=\"Basic mixed styles example\">\n                                <a href=\"/sign-in\" class=\"btn btn-primary\">Sign in</a>\n                            </div>\n                        {{ end }}\n                    </ul>\n                </div>\n                <div class=\"ms-lg-3 d-none d-lg-block d-xl-block\">\n                    {{ template \"cart-num\" . }}\n                </div>\n\n            </div>\n        </nav>\n        <div class=\"bg-primary text-center text-white pt-1 pb-1\">This website is hosted for demo purposes only. It is\n            not an\n            actual shop.\n        </div>\n        {{ if .error }}\n            <div class=\"alert alert-danger text-center\" role=\"alert\">{{ .error }}</div>\n         {{ end }}\n        {{ if .warning }}\n            <div class=\"alert alert-warning text-center\" role=\"alert\">{{ .warning }}</div>\n        {{ end }}\n    </header>\n    <main role=\"main\" class=\"home pt-5\" style=\"min-height:calc(100vh - 212px);\">\n        <div class=\"container\">\n            <h1 class=\"text-center\">{{ $.title }}</h1>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/home.tmpl",
    "content": "{{ define \"home\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items }}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/order.tmpl",
    "content": "{{ define \"order\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n                    <div class=\"card-body row\">\n                        {{ range $.orders }}\n                        <div class=\"card\">\n                            <div class=\"card-body\">\n                              <h6 class=\"card-subtitle mb-2 text-muted\">{{.CreatedDate}} Order ID: {{.OrderId}}</h6>\n                              <ul class=\"list-group col-lg-12 col-sm-15\">\n                                {{ range .Items }}\n                                    <li class=\"list-group-item border-0\">\n                                        <div class=\"card border-0\">\n                                            <div class=\"card-body row\">\n                                                <div class=\"col-3\">\n                                                    <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                                                </div>\n                                                <div class=\"col-3\">\n                                                    <div class=\"mt-1\">{{ .ProductName }}</div>\n                                                </div>\n                                                <div class=\"col-2\">\n                                                    <div class=\"mt-1\">x {{ .Qty }}</div>\n                                                </div>\n                                                <div class=\"col-4\">\n                                                    <div class=\"mt-1\">Cost: {{ .Cost }}</div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </li>\n                                {{ end}}\n                            </ul>\n                            </div>\n                        </div>\n                        <p>\n                        {{ end}}\n                    </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/product.tmpl",
    "content": "{{ define \"product\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div id=\"productPicture\" class=\"carousel slide col-lg-6 col-sm-12\">\n                    <div class=\"carousel-indicators\">\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"0\"\n                                class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"1\"\n                                aria-label=\"Slide 2\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"2\"\n                                aria-label=\"Slide 3\"></button>\n                    </div>\n                    <div class=\"carousel-inner\">\n                        <div class=\"carousel-item active\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                    </div>\n                    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"prev\">\n                        <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Previous</span>\n                    </button>\n                    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"next\">\n                        <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Next</span>\n                    </button>\n                </div>\n                <div class=\"col-lg-1\"></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-center\">\n                    <form action=\"/cart\" method=\"post\">\n                        <h5 class=\"card-title\">{{ .item.Name }}</h5>\n                        <p class=\"card-text\">{{ .item.Description }}</p>\n                        <p class=\"card-text\">${{ .item.Price }}</p>\n                        <input type=\"hidden\" value=\"{{ .item.Id }}\" name=\"productId\">\n                        <label for=\"productNum\">数量：</label>\n                        <input type=\"number\" class=\"form-control mt-3\" id=\"productNum\" name=\"productNum\" value=\"1\"\n                               min=\"1\"/>\n                        <input type=\"submit\" class=\"btn btn-primary mt-3\" value=\"Add to Cart\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/result.tmpl",
    "content": "{{ define \"result\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <i class=\"fa-regular fa-circle-check fs-1 text-success\"></i>\n        <div class=\"text-center fs-3\">\n            Congratulations, you have successfully placed an order.\n        </div>\n    </div>\n    <div class=\"d-flex justify-content-center\">\n        <a href=\"/order\" class=\"btn btn-info\">Check Order</a>\n        <a href=\"/\" class=\"btn btn-success ms-5\">Back to Home</a>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/search.tmpl",
    "content": "{{ define \"search\" }}\n    {{ template \"header\" . }}\n    {{ if .q }}\n        <div class=\"d-inline-block border border-success rounded-4 p-1 ps-4 pe-4\">\n            <div>\n                {{ .q }}\n                <a href=\"/category\" class=\"ps-4\">\n                    <button type=\"button\" class=\"btn btn-sm btn-danger\" aria-label=\"Close\">X</button>\n                </a>\n            </div>\n        </div>\n    {{ end}}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/sign-in.tmpl",
    "content": "{{ define \"sign-in\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/login{{ if .next }}?next={{.next}} {{ end}}\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" required>\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\" required>\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign up</a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign in</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/sign-up.tmpl",
    "content": "{{ define \"sign-up\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" aria-describedby=\"emailHelp\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password-confirm\" class=\"form-label\">Password confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password-confirm\" name=\"password-confirm\">\n            </div>\n            <div class=\"mb-3\">\n                Already have account, click here to <a href=\"/sign-in\">Sign in</a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign up</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/utils.tmpl",
    "content": "{{ define \"required\" }}\n    <span class=\"text-danger\">*</span>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/template/waiting.tmpl",
    "content": "{{ define \"waiting\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <div class=\"text-danger h3 text-center mb-5\">\n            Wait a minutes, please don't close the window\n        </div>\n        <div class=\"spinner-grow text-primary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-secondary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-success\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-danger\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-warning\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-info\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-light\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-dark\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/types/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage types\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype Order struct {\n\tConsignee   Consignee\n\tOrderId     string\n\tCreatedDate string\n\tOrderState  string\n\tCost        float32\n\tItems       []OrderItem\n}\n\ntype OrderItem struct {\n\tProductId   uint32\n\tProductName string\n\tPicture     string\n\tQty         uint32\n\tCost        float32\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"frontend\"\n\ntype SessionUserIdKey string\n\nconst UserIdKey = SessionUserIdKey(\"user_id\")\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) uint32 {\n\tif ctx.Value(UserIdKey) == nil {\n\t\treturn 0\n\t}\n\treturn uint32(ctx.Value(UserIdKey).(float64))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/utils/response.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/utils/safe.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"net/url\"\n\nvar validHost = []string{\n\t\"localhost:8080\",\n}\n\nfunc ValidateNext(next string) bool {\n\turlObj, err := url.Parse(next)\n\tif err != nil {\n\t\treturn false\n\t}\n\tif InArray(urlObj.Host, validHost) {\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/frontend/utils/strings.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nfunc InArray[T int | int32 | int64 | float32 | float64 | string](needle T, haystack []T) bool {\n\tfor _, k := range haystack {\n\t\tif needle == k {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Order{},\n\t\t\t&model.OrderItem{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/model/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype Order struct {\n\tBase\n\tOrderId      string `gorm:\"uniqueIndex;size:256\"`\n\tUserId       uint32\n\tUserCurrency string\n\tConsignee    Consignee   `gorm:\"embedded\"`\n\tOrderItems   []OrderItem `gorm:\"foreignKey:OrderIdRefer;references:OrderId\"`\n}\n\nfunc (o Order) TableName() string {\n\treturn \"order\"\n}\n\nfunc ListOrder(db *gorm.DB, ctx context.Context, userId uint32) (orders []Order, err error) {\n\terr = db.Debug().Model(&Order{}).Where(&Order{UserId: userId}).Preload(\"OrderItems\").Find(&orders).Error\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/model/order_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\ntype OrderItem struct {\n\tBase\n\tProductId    uint32\n\tOrderIdRefer string `gorm:\"size:256;index\"`\n\tQuantity     int32\n\tCost         float32\n}\n\nfunc (oi OrderItem) TableName() string {\n\treturn \"order_item\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/service/list_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype ListOrderService struct {\n\tctx context.Context\n} // NewListOrderService new ListOrderService\nfunc NewListOrderService(ctx context.Context) *ListOrderService {\n\treturn &ListOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListOrderService) Run(req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\t// Finish your business logic.\n\torders, err := model.ListOrder(mysql.DB, s.ctx, req.UserId)\n\tif err != nil {\n\t\tklog.Errorf(\"model.ListOrder.err:%v\", err)\n\t\treturn nil, err\n\t}\n\tvar list []*order.Order\n\tfor _, v := range orders {\n\t\tvar items []*order.OrderItem\n\t\tfor _, v := range v.OrderItems {\n\t\t\titems = append(items, &order.OrderItem{\n\t\t\t\tCost: v.Cost,\n\t\t\t\tItem: &cart.CartItem{\n\t\t\t\t\tProductId: v.ProductId,\n\t\t\t\t\tQuantity:  v.Quantity,\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\to := &order.Order{\n\t\t\tOrderId:      v.OrderId,\n\t\t\tUserId:       v.UserId,\n\t\t\tUserCurrency: v.UserCurrency,\n\t\t\tEmail:        v.Consignee.Email,\n\t\t\tCreatedAt:    int32(v.CreatedAt.Unix()),\n\t\t\tAddress: &order.Address{\n\t\t\t\tCountry:       v.Consignee.Country,\n\t\t\t\tCity:          v.Consignee.City,\n\t\t\t\tStreetAddress: v.Consignee.StreetAddress,\n\t\t\t\tZipCode:       v.Consignee.ZipCode,\n\t\t\t},\n\t\t\tOrderItems: items,\n\t\t}\n\t\tlist = append(list, o)\n\t}\n\tresp = &order.ListOrderResp{\n\t\tOrders: list,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/service/list_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/service/place_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype PlaceOrderService struct {\n\tctx context.Context\n} // NewPlaceOrderService new PlaceOrderService\nfunc NewPlaceOrderService(ctx context.Context) *PlaceOrderService {\n\treturn &PlaceOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *PlaceOrderService) Run(req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\t// Finish your business logic.\n\tif len(req.OrderItems) == 0 {\n\t\terr = fmt.Errorf(\"OrderItems empty\")\n\t\treturn\n\t}\n\n\terr = mysql.DB.Transaction(func(tx *gorm.DB) error {\n\t\torderId, _ := uuid.NewUUID()\n\n\t\to := &model.Order{\n\t\t\tOrderId:      orderId.String(),\n\t\t\tUserId:       req.UserId,\n\t\t\tUserCurrency: req.UserCurrency,\n\t\t\tConsignee: model.Consignee{\n\t\t\t\tEmail: req.Email,\n\t\t\t},\n\t\t}\n\t\tif req.Address != nil {\n\t\t\ta := req.Address\n\t\t\to.Consignee.Country = a.Country\n\t\t\to.Consignee.State = a.State\n\t\t\to.Consignee.City = a.City\n\t\t\to.Consignee.StreetAddress = a.StreetAddress\n\t\t}\n\t\tif err := tx.Create(o).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvar itemList []*model.OrderItem\n\t\tfor _, v := range req.OrderItems {\n\t\t\titemList = append(itemList, &model.OrderItem{\n\t\t\t\tOrderIdRefer: o.OrderId,\n\t\t\t\tProductId:    v.Item.ProductId,\n\t\t\t\tQuantity:     v.Item.Quantity,\n\t\t\t\tCost:         v.Cost,\n\t\t\t})\n\t\t}\n\t\tif err := tx.Create(&itemList).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp = &order.PlaceOrderResp{\n\t\t\tOrder: &order.OrderResult{\n\t\t\t\tOrderId: orderId.String(),\n\t\t\t},\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/biz/service/place_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestPlaceOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"order\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/order\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/google/uuid v1.5.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.18.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=\ngithub.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/service\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n)\n\n// OrderServiceImpl implements the last service interface defined in the IDL.\ntype OrderServiceImpl struct{}\n\n// PlaceOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) PlaceOrder(ctx context.Context, req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = service.NewPlaceOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// ListOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) ListOrder(ctx context.Context, req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\tresp, err = service.NewListOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'order'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := orderservice.NewServer(new(OrderServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/order/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/order\"\nexec \"$CURDIR/bin/order\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\ntmp\n\n.env\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.PaymentLog{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/biz/model/payment.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype PaymentLog struct {\n\tBase\n\tUserId        uint32    `json:\"user_id\"`\n\tOrderId       string    `json:\"order_id\"`\n\tTransactionId string    `json:\"transaction_id\"`\n\tAmount        float32   `json:\"amount\"`\n\tPayAt         time.Time `json:\"pay_at\"`\n}\n\nfunc (p PaymentLog) TableName() string {\n\treturn \"payment\"\n}\n\nfunc CreatePaymentLog(db *gorm.DB, ctx context.Context, payment *PaymentLog) error {\n\treturn db.WithContext(ctx).Model(&PaymentLog{}).Create(payment).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/biz/service/charge.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\tcreditcard \"github.com/durango/go-credit-card\"\n\t\"github.com/google/uuid\"\n)\n\ntype ChargeService struct {\n\tctx context.Context\n} // NewChargeService new ChargeService\nfunc NewChargeService(ctx context.Context) *ChargeService {\n\treturn &ChargeService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ChargeService) Run(req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tcard := creditcard.Card{\n\t\tNumber: req.CreditCard.CreditCardNumber,\n\t\tCvv:    strconv.Itoa(int(req.CreditCard.CreditCardCvv)),\n\t\tMonth:  strconv.Itoa(int(req.CreditCard.CreditCardExpirationMonth)),\n\t\tYear:   strconv.Itoa(int(req.CreditCard.CreditCardExpirationYear)),\n\t}\n\n\terr = card.Validate(true)\n\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(400, err.Error())\n\t}\n\n\ttranslationId, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = model.CreatePaymentLog(mysql.DB, s.ctx, &model.PaymentLog{\n\t\tUserId:        req.UserId,\n\t\tOrderId:       req.OrderId,\n\t\tTransactionId: translationId.String(),\n\t\tAmount:        req.Amount,\n\t\tPayAt:         time.Now(),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &payment.ChargeResp{TransactionId: translationId.String()}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/biz/service/charge_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCharge_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"payment\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/payment\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082\n\tgithub.com/google/uuid v1.5.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.18.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082 h1:3RgcPZrUWhrxqhtDkuRmDTRVXGkxrVMZtJMic7cEtGA=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082/go.mod h1:jKPLGXGRR3v90kZOLs/kUMffoEot8IrRDGmmzI3kOtg=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=\ngithub.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/service\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n)\n\n// PaymentServiceImpl implements the last service interface defined in the IDL.\ntype PaymentServiceImpl struct{}\n\n// Charge implements the PaymentServiceImpl interface.\nfunc (s *PaymentServiceImpl) Charge(ctx context.Context, req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tresp, err = service.NewChargeService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'payment'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/middleware\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := paymentservice.NewServer(new(PaymentServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMiddleware(middleware.ServerMiddleware),\n\t)\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/middleware/mw.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/pkg/endpoint\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n)\n\nfunc ServerMiddleware(next endpoint.Endpoint) endpoint.Endpoint {\n\treturn func(ctx context.Context, req, resp interface{}) (err error) {\n\t\tri := rpcinfo.GetRPCInfo(ctx)\n\t\t// get client serviceName\n\t\tklog.Infof(\"client serviceName: %v\\n\", ri.From().ServiceName())\n\t\tif err := next(ctx, req, resp); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/payment.sql",
    "content": "create table payment\n(\n    id             int auto_increment,\n    user_id        int            not null,\n    order_id       varchar(100)   not null,\n    transaction_id varchar(100)   not null,\n    amount         decimal(10, 2) not null,\n    pay_at         datetime       not null,\n    created_at     datetime       not null default current_timestamp,\n    updated_at     datetime       not null default current_timestamp on update current_timestamp,\n    constraint payment_pk primary key (id)\n);"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/payment\"\nexec \"$CURDIR/bin/payment\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/payment/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n.env"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.Product{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Product{},\n\t\t\t&model.Category{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `product`.`category` VALUES (1,'2023-12-06 15:05:06','2023-12-06 15:05:06','T-Shirt','T-Shirt'),(2,'2023-12-06 15:05:06','2023-12-06 15:05:06','Sticker','Sticker')\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product` VALUES ( 1, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Notebook', 'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ', '/static/image/notebook.jpeg', 9.90 ), ( 2, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Mouse-Pad', 'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ', '/static/image/mouse-pad.jpeg', 8.80 ), ( 3, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt.jpeg', 6.60 ), ( 4, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-1.jpeg', 2.20 ), ( 5, '2023-12-06 15:26:19', '2023-12-09 22:32:35', 'Sweatshirt', 'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.', '/static/image/sweatshirt.jpeg', 1.10 ), ( 6, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-2.jpeg', 1.80 ), ( 7, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'mascot', 'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.', '/static/image/logo.jpg', 4.80 )\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product_category` (product_id,category_id) VALUES ( 1, 2 ), ( 2, 2 ), ( 3, 1 ), ( 4, 1 ), ( 5, 1 ), ( 6, 1 ),( 7, 2 )\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/redis/go-redis/extra/redisotel/v9\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n\tredisotel.InstrumentTracing(RedisClient) //nolint:errcheck\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/model/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Category struct {\n\tBase\n\tName        string    `json:\"name\"`\n\tDescription string    `json:\"description\"`\n\tProducts    []Product `json:\"product\" gorm:\"many2many:product_category\"`\n}\n\nfunc (c Category) TableName() string {\n\treturn \"category\"\n}\n\nfunc GetProductsByCategoryName(db *gorm.DB, ctx context.Context, name string) (category []Category, err error) {\n\terr = db.WithContext(ctx).Model(&Category{}).Where(&Category{Name: name}).Preload(\"Products\").Find(&category).Error\n\treturn category, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/model/product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tBase\n\tName        string     `json:\"name\"`\n\tDescription string     `json:\"description\"`\n\tPicture     string     `json:\"picture\"`\n\tPrice       float32    `json:\"price\"`\n\tCategories  []Category `json:\"categories\" gorm:\"many2many:product_category\"`\n}\n\nfunc (p Product) TableName() string {\n\treturn \"product\"\n}\n\ntype ProductQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (p ProductQuery) GetById(productId int) (product Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn\n}\n\nfunc NewProductQuery(ctx context.Context, db *gorm.DB) ProductQuery {\n\treturn ProductQuery{ctx: ctx, db: db}\n}\n\ntype CachedProductQuery struct {\n\tproductQuery ProductQuery\n\tcacheClient  *redis.Client\n\tprefix       string\n}\n\nfunc (c CachedProductQuery) GetById(productId int) (product Product, err error) {\n\tcacheKey := fmt.Sprintf(\"%s_%s_%d\", c.prefix, \"product_by_id\", productId)\n\tcachedResult := c.cacheClient.Get(c.productQuery.ctx, cacheKey)\n\n\terr = func() error {\n\t\terr1 := cachedResult.Err()\n\t\tif err1 != nil {\n\t\t\treturn err1\n\t\t}\n\t\tcachedResultByte, err2 := cachedResult.Bytes()\n\t\tif err2 != nil {\n\t\t\treturn err2\n\t\t}\n\t\terr3 := json.Unmarshal(cachedResultByte, &product)\n\t\tif err3 != nil {\n\t\t\treturn err3\n\t\t}\n\t\treturn nil\n\t}()\n\n\tif err != nil {\n\t\tproduct, err = c.productQuery.GetById(productId)\n\t\tif err != nil {\n\t\t\treturn Product{}, err\n\t\t}\n\t\tencoded, err := json.Marshal(product)\n\t\tif err != nil {\n\t\t\treturn product, nil\n\t\t}\n\t\t_ = c.cacheClient.Set(c.productQuery.ctx, cacheKey, encoded, time.Hour)\n\t}\n\treturn\n}\n\nfunc NewCachedProductQuery(pq ProductQuery, cacheClient *redis.Client) CachedProductQuery {\n\treturn CachedProductQuery{productQuery: pq, cacheClient: cacheClient, prefix: \"cloudwego_shop\"}\n}\n\nfunc GetProductById(db *gorm.DB, ctx context.Context, productId int) (product Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn product, err\n}\n\nfunc SearchProduct(db *gorm.DB, ctx context.Context, q string) (product []*Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Find(&product, \"name like ? or description like ?\", \"%\"+q+\"%\", \"%\"+q+\"%\").Error\n\treturn product, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetProductService struct {\n\tctx context.Context\n} // NewGetProductService new GetProductService\nfunc NewGetProductService(ctx context.Context) *GetProductService {\n\treturn &GetProductService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetProductService) Run(req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\t// Finish your business logic.\n\tif req.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40000, \"product id is required\")\n\t}\n\n\tp, err := model.NewCachedProductQuery(model.NewProductQuery(s.ctx, mysql.DB), redis.RedisClient).GetById(int(req.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &product.GetProductResp{\n\t\tProduct: &product.Product{\n\t\t\tId:          uint32(p.ID),\n\t\t\tPicture:     p.Picture,\n\t\t\tPrice:       p.Price,\n\t\t\tDescription: p.Description,\n\t\t\tName:        p.Name,\n\t\t},\n\t}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/service/get_product_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetProduct_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewGetProductService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.GetProductRequest{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/service/list_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype ListProductsService struct {\n\tctx context.Context\n} // NewListProductsService new ListProductsService\nfunc NewListProductsService(ctx context.Context) *ListProductsService {\n\treturn &ListProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListProductsService) Run(req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\t// Finish your business logic.\n\tc, err := model.GetProductsByCategoryName(mysql.DB, s.ctx, req.CategoryName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &product.ListProductsResp{}\n\tfor _, v1 := range c {\n\t\tfor _, v := range v1.Products {\n\t\t\tresp.Products = append(resp.Products, &product.Product{Id: uint32(v.ID), Name: v.Name, Description: v.Description, Picture: v.Picture, Price: v.Price})\n\t\t}\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/service/list_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewListProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.ListProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype SearchProductsService struct {\n\tctx context.Context\n} // NewSearchProductsService new SearchProductsService\nfunc NewSearchProductsService(ctx context.Context) *SearchProductsService {\n\treturn &SearchProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SearchProductsService) Run(req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\t// Finish your business logic.\n\tp, err := model.SearchProduct(mysql.DB, s.ctx, req.Query)\n\tvar results []*product.Product\n\tfor _, v := range p {\n\t\tresults = append(results, &product.Product{\n\t\t\tId:          uint32(v.ID),\n\t\t\tName:        v.Name,\n\t\t\tDescription: v.Description,\n\t\t\tPicture:     v.Picture,\n\t\t\tPrice:       v.Price,\n\t\t})\n\t}\n\treturn &product.SearchProductsResp{Results: results}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/biz/service/search_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestSearchProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewSearchProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.SearchProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"product\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n\t// Centralized Config Server\n\tConfigServer ConfigServer `yaml:\"configServer\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\ntype ConfigServer struct{}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/product\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.18.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ=\ngithub.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/service\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\n// ProductCatalogServiceImpl implements the last service interface defined in the IDL.\ntype ProductCatalogServiceImpl struct{}\n\n// ListProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) ListProducts(ctx context.Context, req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\tresp, err = service.NewListProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetProduct implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) GetProduct(ctx context.Context, req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tresp, err = service.NewGetProductService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// SearchProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) SearchProducts(ctx context.Context, req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\tresp, err = service.NewSearchProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'product'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := productcatalogservice.NewServer(new(ProductCatalogServiceImpl), opts...)\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\topts = append(opts,\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/product\"\nexec \"$CURDIR/bin/product\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/script/product.sql",
    "content": "CREATE TABLE `category`\n(\n    `id`          int          NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)  NOT NULL,\n    `description` varchar(255) NOT NULL,\n    `created_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `category`\nVALUES (1, 'Clothes', 'Clothes', '2023-12-06 15:05:06', '2023-12-06 15:05:06'),\n       (2, 'Other', 'Other', '2023-12-06 15:05:06', '2023-12-06 15:05:06');\nCREATE TABLE `product`\n(\n    `id`          int            NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)    NOT NULL,\n    `description` varchar(255)   NOT NULL,\n    `picture`     varchar(255)   NOT NULL,\n    `price`       decimal(10, 2) NOT NULL,\n    `created_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product`\nVALUES (1, 'Notebook',\n        'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ',\n        '/static/image/notebook.jpeg', 9.90, '2023-12-06 15:26:19', '2023-12-09 22:29:10'),\n       (2, 'Mouse-Pad',\n        'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ',\n        '/static/image/mouse-pad.jpeg', 8.80, '2023-12-06 15:26:19', '2023-12-09 22:29:59'),\n       (3, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt.jpeg', 6.60, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (4, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-1.jpeg', 2.20, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (5, 'Sweatshirt',\n        'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.',\n        '/static/image/sweatshirt.jpeg', 1.10, '2023-12-06 15:26:19', '2023-12-09 22:32:35'),\n       (6, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-2.jpeg', 1.80, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (10, 'mascot',\n        'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.',\n        '/static/image/logo.jpg', 4.80, '2023-12-06 15:26:19', '2023-12-09 22:39:47');\nCREATE TABLE `product_category`\n(\n    `id`          int      NOT NULL AUTO_INCREMENT,\n    `product_id`  int      NOT NULL,\n    `category_id` int      NOT NULL,\n    `created_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product_category`\nVALUES (1, 1, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (2, 2, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (3, 3, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (4, 4, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (5, 5, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (6, 6, 1, '2023-12-06 15:27:30', '2023-12-09 22:41:47'),\n       (10, 10, 2, '2023-12-06 15:27:30', '2023-12-06 15:27:30');"
  },
  {
    "path": "gomall/tutorial/ch16/app/product/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"shop-product\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.User{})\n\t\terr := DB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.User{},\n\t\t)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `user` (`id`,`created_at`,`updated_at`,`email`,`password_hashed`) VALUES (1,'2023-12-26 09:46:19.852','2023-12-26 09:46:19.852','123@admin.com','$2a$10$jTvUFh7Z8Kw0hLV8WrAws.PRQTeuH4gopJ7ZMoiFvwhhz5Vw.bj7C')\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"time\"\n)\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tBase\n\tEmail          string `gorm:\"unique\"`\n\tPasswordHashed string\n}\n\nfunc (u User) TableName() string {\n\treturn \"user\"\n}\n\nfunc GetByEmail(db *gorm.DB, ctx context.Context, email string) (user *User, err error) {\n\terr = db.WithContext(ctx).Model(&User{}).Where(&User{Email: email}).First(&user).Error\n\treturn\n}\n\nfunc Create(db *gorm.DB, ctx context.Context, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tklog.Infof(\"LoginReq:%+v\", req)\n\tuserRow, err := model.GetByEmail(mysql.DB, s.ctx, req.Email)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(userRow.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn\n\t}\n\treturn &user.LoginResp{UserId: int32(userRow.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewLoginService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.LoginReq{\n\t// \tEmail:    \"1111@qq.com\",\n\t// \tPassword: \"123\",\n\t// }\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Password != req.ConfirmPassword {\n\t\terr = errors.New(\"Password must be the same as ConfirmPassword\")\n\t\treturn\n\t}\n\thashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(hashedPassword),\n\t}\n\tif err = model.Create(mysql.DB, s.ctx, newUser); err != nil {\n\t\treturn\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewRegisterService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.RegisterReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.18.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\topts = append(opts, server.WithSuite(tracing.NewServerSuite()))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch16/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/common/clientsuite/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage clientsuite\n\nimport (\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\t\"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n)\n\ntype CommonGrpcClientSuite struct {\n\tDestServiceName    string\n\tDestServiceAddr    string\n\tCurrentServiceName string\n\tTracerProvider     *tracesdk.TracerProvider\n}\n\nfunc (s CommonGrpcClientSuite) Options() []client.Option {\n\topts := []client.Option{\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t}\n\n\t_ = provider.NewOpenTelemetryProvider(provider.WithSdkTracerProvider(s.TracerProvider), provider.WithEnableMetrics(false))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\t\tServiceName: s.CurrentServiceName,\n\t\t}),\n\t\tclient.WithSuite(tracing.NewClientSuite()),\n\t)\n\n\treturn opts\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/common/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/common\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire (\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/prometheus/client_golang v1.18.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.21.0\n\tgo.uber.org/zap v1.26.0\n)\n\nrequire (\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n"
  },
  {
    "path": "gomall/tutorial/ch16/common/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch16/common/mtl/log.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexzap \"github.com/kitex-contrib/obs-opentelemetry/logging/zap\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\"\n)\n\nfunc InitLog() {\n\tvar opts []kitexzap.Option\n\tvar output zapcore.WriteSyncer\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\topts = append(opts, kitexzap.WithCoreEnc(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())))\n\t\toutput = os.Stdout\n\t} else {\n\t\topts = append(opts, kitexzap.WithCoreEnc(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())))\n\t\t// async log\n\t\toutput = &zapcore.BufferedWriteSyncer{\n\t\t\tWS:            zapcore.AddSync(os.Stdout),\n\t\t\tFlushInterval: time.Minute,\n\t\t}\n\t\tserver.RegisterShutdownHook(func() {\n\t\t\toutput.Sync() //nolint:errcheck\n\t\t})\n\t}\n\tlog := kitexzap.NewLogger(opts...)\n\tklog.SetLogger(log)\n\tklog.SetLevel(klog.LevelTrace)\n\tklog.SetOutput(output)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/common/mtl/metrics.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"net\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/kitex/pkg/registry\"\n\t\"github.com/cloudwego/kitex/server\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/collectors\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n)\n\nvar Registry *prometheus.Registry\n\nfunc InitMetric(serviceName string, metricsPort string, registryAddr string) {\n\tRegistry = prometheus.NewRegistry()\n\tRegistry.MustRegister(collectors.NewGoCollector())\n\tRegistry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))\n\n\tr, _ := consul.NewConsulRegister(registryAddr)\n\n\taddr, _ := net.ResolveTCPAddr(\"tcp\", metricsPort)\n\n\tregistryInfo := &registry.Info{\n\t\tServiceName: \"prometheus\",\n\t\tAddr:        addr,\n\t\tWeight:      1,\n\t\tTags:        map[string]string{\"service\": serviceName},\n\t}\n\n\t_ = r.Register(registryInfo)\n\n\tserver.RegisterShutdownHook(func() {\n\t\tr.Deregister(registryInfo) //nolint:errcheck\n\t})\n\n\thttp.Handle(\"/metrics\", promhttp.HandlerFor(Registry, promhttp.HandlerOpts{}))\n\tgo http.ListenAndServe(metricsPort, nil) //nolint:errcheck\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/common/mtl/tracing.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/server\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.17.0\"\n)\n\nvar TracerProvider *tracesdk.TracerProvider\n\nfunc InitTracing(serviceName string) {\n\texporter, err := otlptracegrpc.New(context.Background())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tserver.RegisterShutdownHook(func() {\n\t\texporter.Shutdown(context.Background()) //nolint:errcheck\n\t})\n\tprocessor := tracesdk.NewBatchSpanProcessor(exporter)\n\tres, err := resource.New(context.Background(), resource.WithAttributes(semconv.ServiceNameKey.String(serviceName)))\n\tif err != nil {\n\t\tres = resource.Default()\n\t}\n\tTracerProvider = tracesdk.NewTracerProvider(tracesdk.WithSpanProcessor(processor), tracesdk.WithResource(res))\n\totel.SetTracerProvider(TracerProvider)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/common/serversuite/server.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage serversuite\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\tprometheus \"github.com/kitex-contrib/monitor-prometheus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n)\n\ntype CommonServerSuite struct {\n\tCurrentServiceName string\n}\n\nfunc (s CommonServerSuite) Options() []server.Option {\n\topts := []server.Option{\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t}\n\n\t_ = provider.NewOpenTelemetryProvider(provider.WithSdkTracerProvider(mtl.TracerProvider), provider.WithEnableMetrics(false))\n\n\topts = append(opts,\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\t\tServiceName: s.CurrentServiceName,\n\t\t}),\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithTracer(prometheus.NewServerTracer(\"\", \"\", prometheus.WithDisableServer(true), prometheus.WithRegistry(mtl.Registry))),\n\t)\n\n\treturn opts\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/common/utils/kitex.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/tutorial/ch16/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"unique\"`\n\tPassword string `gorm:\"varchar(64),not null\"`\n}\n\nfunc (u User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\tmysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"a958af3702caf245d205da6164afebe0\"})\n\tvar u model.User\n\tmysql.DB.First(&u)\n\tfmt.Printf(\"%#v\", u)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch16/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch16/deploy/Dockerfile.frontend",
    "content": "FROM golang:1.21 AS builder\n\nWORKDIR /usr/src/gomall\n\n# Set the GOPROXY environment variable to use the goproxy.io proxy (for China)\nENV GOPROXY=https://goproxy.io,direct\n\n# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change\nCOPY app/frontend/go.mod app/frontend/go.sum ./app/frontend/\nCOPY rpc_gen rpc_gen\nCOPY common common\n\nRUN cd common && go mod download && go mod verify\nRUN cd app/frontend/ && go mod download && go mod verify\n\nCOPY app/frontend app/frontend\n\nRUN cd app/frontend/ && CGO_ENABLED=0 go build -v -o /opt/gomall/frontend/server\n\nFROM busybox\n\nCOPY --from=builder /opt/gomall/frontend/server /opt/gomall/frontend/server\n\nCOPY app/frontend/conf /opt/gomall/frontend/conf\nCOPY app/frontend/static /opt/gomall/frontend/static\nCOPY app/frontend/template /opt/gomall/frontend/template\n\nWORKDIR /opt/gomall/frontend\n\nEXPOSE 8080\n\nCMD [\"./server\"]\n"
  },
  {
    "path": "gomall/tutorial/ch16/deploy/Dockerfile.svc",
    "content": "FROM golang:1.21 AS builder\n\nARG SVC\n\nWORKDIR /usr/src/gomall\n\n# Set the GOPROXY environment variable to use the goproxy.io proxy (for China)\nENV GOPROXY=https://goproxy.io,direct\n\n# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change\nCOPY app/${SVC}/go.mod app/${SVC}/go.sum ./app/${SVC}/\nCOPY rpc_gen rpc_gen\nCOPY common common\n\nRUN cd common && go mod download && go mod verify\nRUN cd app/${SVC}/ && go mod download && go mod verify\n\nCOPY app/${SVC} app/${SVC}\n\nRUN cd app/${SVC}/ && CGO_ENABLED=0 go build -v -o /opt/gomall/${SVC}/server\n\nFROM busybox\n\nARG SVC\n\nCOPY --from=builder /opt/gomall/${SVC}/server /opt/gomall/${SVC}/server\n\nCOPY app/${SVC}/conf /opt/gomall/${SVC}/conf\n\nWORKDIR /opt/gomall/${SVC}\n\nCMD [\"./server\"]\n"
  },
  {
    "path": "gomall/tutorial/ch16/deploy/config/prometheus.yml",
    "content": "global:\n  scrape_interval: 15s\n\nscrape_configs:\n  - job_name: \"consul\"\n    consul_sd_configs:\n      - server: consul:8500\n        services:\n          - prometheus\n    relabel_configs:\n      - source_labels: [ __meta_consul_tags ]\n        action: replace\n        target_label: service\n        regex: \".*service:(.*?),.*\"\n        replacement: \"$1\"\n\n      - source_labels: [ __meta_consul_service_id ]\n        target_label: __metrics_path__\n        replacement: /metrics\n"
  },
  {
    "path": "gomall/tutorial/ch16/deploy/gomall-dev-app.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: product\nspec:\n  selector:\n    matchLabels:\n      app: product\n  template:\n    metadata:\n      labels:\n        app: product\n    spec:\n      containers:\n      - name: product\n        image: \"product:v1.1.1\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"128Mi\"\n            cpu: \"500m\"\n        volumeMounts:\n        - name: product-config\n          mountPath: /opt/gomall/product/conf/dev\n        env:\n        - name: GO_ENV\n          value: \"dev\"\n        - name: MYSQL_HOST\n          value: \"mysql-svc\"\n        - name: MYSQL_USER\n          value: \"root\"\n        - name: MYSQL_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: mysql-paasword\n              key: password\n      volumes:\n      - name: product-config\n        configMap:\n          name: gomall-config\n          items:\n          - key: product-app-config\n            path: conf.yaml\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: frontend\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  template:\n    metadata:\n      labels:\n        app: frontend\n    spec:\n      containers:\n      - name: frontend\n        image: \"frontend:v1.1.1\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"128Mi\"\n            cpu: \"500m\"\n        ports:\n        - containerPort: 8080\n        volumeMounts:\n        - name: frontend-config\n          mountPath: /opt/gomall/frontend/conf/dev\n        env:\n        - name: GO_ENV\n          value: \"dev\"\n        - name: SESSION_SECRET\n          value: \"4UFIOADJFIJIASOFJI\"\n        - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\n          value: \"http://jaeger-svc:4317\"\n        - name: OTEL_EXPORTER_OTLP_INSECURE\n          value: \"true\"\n      volumes:\n      - name: frontend-config\n        configMap:\n          name: gomall-config\n          items:\n          - key: frontend-app-config\n            path: conf.yaml\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: cart\nspec:\n  selector:\n    matchLabels:\n      app: cart\n  template:\n    metadata:\n      labels:\n        app: cart\n    spec:\n      containers:\n      - name: cart\n        image: \"cart:v1.1.1\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"128Mi\"\n            cpu: \"500m\"\n        volumeMounts:\n        - name: cart-config\n          mountPath: /opt/gomall/cart/conf/dev\n        env:\n        - name: GO_ENV\n          value: \"dev\"\n        - name: MYSQL_HOST\n          value: \"mysql-svc\"\n        - name: MYSQL_USER\n          value: \"root\"\n        - name: MYSQL_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: mysql-paasword\n              key: password\n      volumes:\n      - name: cart-config\n        configMap:\n          name: gomall-config\n          items:\n          - key: cart-app-config\n            path: conf.yaml\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: checkout\nspec:\n  selector:\n    matchLabels:\n      app: checkout\n  template:\n    metadata:\n      labels:\n        app: checkout\n    spec:\n      containers:\n      - name: checkout\n        image: \"checkout:v1.1.1\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"128Mi\"\n            cpu: \"500m\"\n     \n        volumeMounts:\n        - name: checkout-config\n          mountPath: /opt/gomall/checkout/conf/dev\n        env:\n        - name: GO_ENV\n          value: \"dev\"\n        - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\n          value: \"http://jaeger-svc:4317\"\n        - name: OTEL_EXPORTER_OTLP_INSECURE\n          value: \"true\"\n      volumes:\n      - name: checkout-config\n        configMap:\n          name: gomall-config\n          items:\n          - key: checkout-app-config\n            path: conf.yaml\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: email\nspec:\n  selector:\n    matchLabels:\n      app: email\n  template:\n    metadata:\n      labels:\n        app: email\n    spec:\n      containers:\n      - name: email\n        image: \"email:v1.1.1\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"128Mi\"\n            cpu: \"500m\"\n        volumeMounts:\n        - name: email-config\n          mountPath: /opt/gomall/email/conf/dev\n        env:\n        - name: GO_ENV\n          value: \"dev\"\n      volumes:\n      - name: email-config\n        configMap:\n          name: gomall-config\n          items:\n          - key: email-app-config\n            path: conf.yaml\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: order\nspec:\n  selector:\n    matchLabels:\n      app: order\n  template:\n    metadata:\n      labels:\n        app: order\n    spec:\n      containers:\n      - name: order\n        image: \"order:v1.1.1\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"128Mi\"\n            cpu: \"500m\"\n        volumeMounts:\n        - name: order-config\n          mountPath: /opt/gomall/order/conf/dev\n        env:\n        - name: GO_ENV\n          value: \"dev\"\n        - name: MYSQL_HOST\n          value: \"mysql-svc\"\n        - name: MYSQL_USER\n          value: \"root\"\n        - name: MYSQL_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: mysql-paasword\n              key: password\n      volumes:\n      - name: order-config\n        configMap:\n          name: gomall-config\n          items:\n          - key: order-app-config\n            path: conf.yaml\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: payment\nspec:\n  selector:\n    matchLabels:\n      app: payment\n  template:\n    metadata:\n      labels:\n        app: payment\n    spec:\n      containers:\n      - name: payment\n        image: \"payment:v1.1.1\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"128Mi\"\n            cpu: \"500m\"\n        volumeMounts:\n        - name: payment-config\n          mountPath: /opt/gomall/payment/conf/dev\n        env:\n        - name: GO_ENV\n          value: \"dev\"\n        - name: MYSQL_HOST\n          value: \"mysql-svc\"\n        - name: MYSQL_USER\n          value: \"root\"\n        - name: MYSQL_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: mysql-paasword\n              key: password\n      volumes:\n      - name: payment-config\n        configMap:\n          name: gomall-config\n          items:\n          - key: payment-app-config\n            path: conf.yaml\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: user\nspec:\n  selector:\n    matchLabels:\n      app: user\n  template:\n    metadata:\n      labels:\n        app: user\n    spec:\n      containers:\n      - name: user\n        image: \"user:v1.1.1\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"128Mi\"\n            cpu: \"500m\"\n        volumeMounts:\n        - name: user-config\n          mountPath: /opt/gomall/user/conf/dev\n        env:\n        - name: GO_ENV\n          value: \"dev\"\n        - name: MYSQL_HOST\n          value: \"mysql-svc\"\n        - name: MYSQL_USER\n          value: \"root\"\n        - name: MYSQL_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: mysql-paasword\n              key: password\n      volumes:\n      - name: user-config\n        configMap:\n          name: gomall-config\n          items:\n          - key: user-app-config\n            path: conf.yaml\n\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: gomall-config\ndata:\n  product-app-config: |\n    kitex:\n      service: \"product\"\n      address: \":8881\"\n      metrics_port: \":9991\"\n      log_level: info\n      log_file_name: \"log/kitex.log\"\n      log_max_size: 10\n      log_max_age: 3\n      log_max_backups: 50\n    registry:\n      registry_address:\n        - consul-svc:8500\n      username: \"\"\n      password: \"\"\n    mysql:\n      dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n    redis:\n      address: \"redis-svc:6379\"\n      username: \"\"\n      password: \"\"\n      db: 0\n  frontend-app-config: |\n    hertz:\n      address: \":8080\"\n      metrics_port: 8090\n      enable_pprof: false\n      enable_gzip: true\n      enable_access_log: true\n      log_level: info\n      log_file_name: \"log/hertz.log\"\n      log_max_size: 10\n      log_max_age: 3\n      log_max_backups: 50\n      registry_addr: \"consul-svc:8500\"\n    mysql:\n      dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n    redis:\n      address: \"redis-svc:6379\"\n      username: \"\"\n      password: \"\"\n      db: 0\n  cart-app-config: |\n    kitex:\n      service: \"cart\"\n      address: \":8883\"\n      metrics_port: \":9993\"\n      log_level: info\n      log_file_name: \"log/kitex.log\"\n      log_max_size: 10\n      log_max_age: 3\n      log_max_backups: 50\n    registry:\n      registry_address:\n        - consul-svc:8500\n      username: \"\"\n      password: \"\"\n    mysql:\n      dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n    redis:\n      address: \"redis-svc:6379\"\n      username: \"\"\n      password: \"\"\n      db: 0\n  checkout-app-config: |\n    kitex:\n      service: \"checkout\"\n      address: \":8884\"\n      metrics_port: \":9994\"\n      log_level: info\n      log_file_name: \"log/kitex.log\"\n      log_max_size: 10\n      log_max_age: 3\n      log_max_backups: 50\n    registry:\n      registry_address:\n        - consul-svc:8500\n      username: \"\"\n      password: \"\"\n    mysql:\n      dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n    redis:\n      address: \"redis-svc:6379\"\n      username: \"\"\n      password: \"\"\n      db: 0\n    nats:\n      address: \"nats-svc:4222\"\n  email-app-config: |\n    kitex:\n      service: \"email\"\n      address: \":8888\"\n      log_level: info\n      log_file_name: \"log/kitex.log\"\n      log_max_size: 10\n      log_max_age: 3\n      log_max_backups: 50\n    registry:\n      registry_address:\n        - consul-svc:2379\n      username: \"\"\n      password: \"\"\n    mysql:\n      dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n    redis:\n      address: \"127.0.0.1:6379\"\n      username: \"\"\n      password: \"\"\n      db: 0\n    nats:\n      address: \"nats-svc:4222\"\n  order-app-config: |\n    kitex:\n      service: \"order\"\n      address: \":8885\"\n      metrics_port: \":9995\"\n      log_level: info\n      log_file_name: \"log/kitex.log\"\n      log_max_size: 10\n      log_max_age: 3\n      log_max_backups: 50\n    registry:\n      registry_address:\n        - consul-svc:8500\n      username: \"\"\n      password: \"\"\n    mysql:\n      dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n    redis:\n      address: \"redis-svc:6379\"\n      username: \"\"\n      password: \"\"\n      db: 0\n  payment-app-config: |\n    kitex:\n      service: \"payment\"\n      address: \":8886\"\n      metrics_port: \":9996\"\n      log_level: info\n      log_file_name: \"log/kitex.log\"\n      log_max_size: 10\n      log_max_age: 3\n      log_max_backups: 50\n    registry:\n      registry_address:\n        - consul-svc:8500\n      username: \"\"\n      password: \"\"\n    mysql:\n      dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n    redis:\n      address: \"127.0.0.1:6379\"\n      username: \"\"\n      password: \"\"\n      db: 0\n  user-app-config: |\n    kitex:\n      service: \"user\"\n      address: \":8882\"\n      metrics_port: \":9992\"\n      log_level: debug\n      log_file_name: \"log/kitex.log\"\n      log_max_size: 10\n      log_max_age: 3\n      log_max_backups: 50\n    registry:\n      registry_address:\n        - consul-svc:8500\n      username: \"\"\n      password: \"\"\n    mysql:\n      dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n    redis:\n      address: \"redis-svc:6379\"\n      username: \"\"\n      password: \"\"\n      db: 0\n\n\n"
  },
  {
    "path": "gomall/tutorial/ch16/deploy/gomall-dev-base.yaml",
    "content": "---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: mysql\nspec:\n  selector:\n    matchLabels:\n      app: mysql\n  template:\n    metadata:\n      labels:\n        app: mysql\n    spec:\n      containers:\n      - name: mysql\n        image: \"mysql:latest\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"500Mi\"\n            cpu: \"500m\"\n        ports:\n        - containerPort: 3306\n        env:\n        - name: MYSQL_ROOT_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: mysql-paasword\n              key: password\n        volumeMounts:\n        - mountPath: /docker-entrypoint-initdb.d\n          name: initdb\n      volumes:\n      - name: initdb\n        hostPath: \n          path: /opt/gomall/db/sql/ini\n          type: Directory\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: mysql-svc\nspec:\n  selector:\n    app: mysql\n  ports:\n  - port: 3306\n    targetPort: 3306\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: consul\nspec:\n  selector:\n    matchLabels:\n      app: consul\n  template:\n    metadata:\n      labels:\n        app: consul\n    spec:\n      containers:\n      - name: consul\n        image: \"consul:1.15.4\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"500Mi\"\n            cpu: \"500m\"\n        ports:\n        - containerPort: 8500\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: consul-svc\nspec:\n  selector:\n    app: consul\n  ports:\n  - port: 8500\n    targetPort: 8500\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: redis\nspec:\n  selector:\n    matchLabels:\n      app: redis\n  template:\n    metadata:\n      labels:\n        app: redis\n    spec:\n      containers:\n      - name: redis\n        image: \"redis:latest\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"500Mi\"\n            cpu: \"500m\"\n        ports:\n        - containerPort: 6379\n          protocol: TCP\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: redis-svc\nspec:\n  selector:\n    app: redis\n  ports:\n  - port: 6379\n    targetPort: 6379\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: nats\nspec:\n  selector:\n    matchLabels:\n      app: nats\n  template:\n    metadata:\n      labels:\n        app: nats\n    spec:\n      containers:\n      - name: nats\n        image: \"nats:latest\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"500Mi\"\n            cpu: \"500m\"\n        ports:\n        - containerPort: 4222\n        - containerPort: 8222\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: nats-svc\nspec:\n  selector:\n    app: nats\n  ports:\n  - port: 4222\n    targetPort: 4222\n    name: \"4222\"\n  - port: 8222\n    targetPort: 8222\n    name: \"8222\"\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: jaeger\nspec:\n  selector:\n    matchLabels:\n      app: jaeger\n  template:\n    metadata:\n      labels:\n        app: jaeger\n    spec:\n      containers:\n      - name: jaeger\n        image: \"jaegertracing/all-in-one:latest\"\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: \"500Mi\"\n            cpu: \"500m\"\n        ports:\n        - containerPort: 16686\n        - containerPort: 4317\n        - containerPort: 4318\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: jaeger-svc\nspec:\n  selector:\n    app: jaeger\n  ports:\n  - port: 16686\n    targetPort: 16686\n    name: \"16686\"\n  - port: 4317\n    targetPort: 4317\n    name: \"4317\"\n  - port: 4318\n    targetPort: 4318\n    name: \"4318\"\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: prometheus\nspec:\n  selector:\n    matchLabels:\n      app: prometheus\n  template:\n    metadata:\n      labels:\n        app: prometheus\n    spec:\n      containers:\n      - name: prometheus\n        image: \"prom/prometheus:latest\"\n        imagePullPolicy: IfNotPresent\n        args:\n          - \"--config.file=/etc/prometheus/prometheus.yml\"\n        resources:\n          limits:\n            memory: \"500Mi\"\n            cpu: \"500m\"\n        ports:\n        - containerPort: 9090\n        volumeMounts:\n        - mountPath: /etc/prometheus/prometheus.yml\n          name: prom-config\n      volumes:\n      - name: prom-config\n        hostPath: \n          path: /opt/gomall/deploy/config/prometheus.yml\n          type: File\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus-svc\nspec:\n  selector:\n    app: prometheus\n  ports:\n  - port: 9090\n    targetPort: 9090\n    name: \"9090\"\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: mysql-paasword\ntype: Opaque\ndata:\n  password: cm9vdA==\n"
  },
  {
    "path": "gomall/tutorial/ch16/deploy/gomall-dev-cluster.yaml",
    "content": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nname: gomall-dev\nnodes:\n- role: control-plane\n  image: kindest/node:v1.30.0\n  extraMounts:\n  - hostPath: ./db/sql/ini\n    containerPath: /opt/gomall/db/sql/ini\n  - hostPath: ./deploy/config\n    containerPath: /opt/gomall/deploy/config\n\n- role: worker\n  image: kindest/node:v1.30.0\n  extraMounts:\n  - hostPath: ./db/sql/ini\n    containerPath: /opt/gomall/db/sql/ini\n  - hostPath: ./deploy/config\n    containerPath: /opt/gomall/deploy/config\n\n# image for China: registry.cn-hangzhou.aliyuncs.com/kindest/node:v1.30.0\n- role: worker\n  image: kindest/node:v1.30.0\n  extraMounts:\n  - hostPath: ./db/sql/ini\n    containerPath: /opt/gomall/db/sql/ini\n  - hostPath: ./deploy/config\n    containerPath: /opt/gomall/deploy/config\n"
  },
  {
    "path": "gomall/tutorial/ch16/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: \"redis:latest\"\n    ports:\n      - 6379:6379\n  nats:\n    image: nats:latest\n    ports:\n      - \"4222:4222\"\n      - \"8222:8222\"\n  # Jaeger\n  jaeger-all-in-one:\n    image: jaegertracing/all-in-one:latest\n    ports:\n      - \"16686:16686\"\n      - \"4317:4317\"\n      - \"4318:4318\"\n  prometheus:\n    image: prom/prometheus:latest\n    volumes:\n      - ./deploy/config/prometheus.yml:/etc/prometheus/prometheus.yml\n    command:\n      - \"--config.file=/etc/prometheus/prometheus.yml\"\n    ports:\n      - \"9090:9090\"\n"
  },
  {
    "path": "gomall/tutorial/ch16/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/cart\n\t./app/checkout\n\t./app/email\n\t./app/frontend\n\t./app/order\n\t./app/payment\n\t./app/product\n\t./app/user\n\t./common\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/andeya/ameda v1.5.3 // indirect\n\tgithub.com/andeya/goutil v1.0.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.11 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.7.0 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.3.0 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/hello_world/go.sum",
    "content": "github.com/andeya/ameda v1.5.3 h1:SvqnhQPZwwabS8HQTRGfJwWPl2w9ZIPInHAw9aE1Wlk=\ngithub.com/andeya/ameda v1.5.3/go.mod h1:FQDHRe1I995v6GG+8aJ7UIUToEmbdTJn/U26NCPIgXQ=\ngithub.com/andeya/goutil v1.0.1 h1:eiYwVyAnnK0dXU5FJsNjExkJW4exUGn/xefPt3k4eXg=\ngithub.com/andeya/goutil v1.0.1/go.mod h1:jEG5/QnnhG7yGxwFUX6Q+JGMif7sjdHmmNVjn7nhJDo=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11 h1:jJgmoDKPKacGl0llPYbYL/+/2N+Ng0vV0ipbnVssXHY=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11/go.mod h1:UAyKh4ZRLBPGsyTRFZoPqTni1TlojMdOJXQnEIPCX84=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=\ngithub.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/nyaruka/phonenumbers v1.3.0 h1:IFyyJfF2Elg8xGKFghWrRXzb6qAHk+Q3uPqmIgS20JQ=\ngithub.com/nyaruka/phonenumbers v1.3.0/go.mod h1:4jyKp/BFUokLbCHyoZag+T3S1KezFVoEKtgnbpzItC4=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch16/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n  optional string raw_body = 50101;\n  optional string query = 50102;\n  optional string header = 50103;\n  optional string cookie = 50104;\n  optional string body = 50105;\n  optional string path = 50106;\n  optional string vd = 50107;\n  optional string form = 50108;\n  optional string js_conv = 50109;\n  optional string file_name = 50110;\n  optional string none = 50111;\n\n  // 50131~50160 used to extend field option by hz\n  optional string form_compatible = 50131;\n  optional string js_conv_compatible = 50132;\n  optional string file_name_compatible = 50133;\n  optional string none_compatible = 50134;\n  // 50135 is reserved to vt_compatible\n  // optional FieldRules vt_compatible = 50135;\n\n  optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n  optional string get = 50201;\n  optional string post = 50202;\n  optional string put = 50203;\n  optional string delete = 50204;\n  optional string patch = 50205;\n  optional string options = 50206;\n  optional string head = 50207;\n  optional string any = 50208;\n  optional string gen_path =\n      50301; // The path specified by the user when the client code is\n             // generated, with a higher priority than api_version\n  optional string api_version =\n      50302; // Specify the value of the :version variable in path when the\n             // client code is generated\n  optional string tag = 50303;  // rpc tag, can be multiple, separated by commas\n  optional string name = 50304; // Name of rpc\n  optional string api_level = 50305;  // Interface Level\n  optional string serializer = 50306; // Serialization method\n  optional string param =\n      50307; // Whether client requests take public parameters\n  optional string baseurl = 50308; // Baseurl used in ttnet routing\n  optional string handler_path =\n      50309; // handler_path specifies the path to generate the method\n\n  // 50331~50360 used to extend method option by hz\n  optional string handler_path_compatible =\n      50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n  optional int32 http_code = 50401;\n\n  // 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n  optional string base_domain = 50402;\n\n  // 50731~50760 used to extend service option by hz\n  optional string base_domain_compatible = 50731;\n  optional string service_path = 50732;\n}\n\nextend google.protobuf.MessageOptions {\n  // optional FieldRules msg_vt = 50111;\n\n  optional string reserve = 50830;\n  // 550831 is reserved to msg_vt_compatible\n  // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/idl/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart;\n\noption go_package = '/cart';\n\nservice CartService {\n  rpc AddItem(AddItemReq) returns (AddItemResp) {}\n  rpc GetCart(GetCartReq) returns (GetCartResp) {}\n  rpc EmptyCart(EmptyCartReq) returns (EmptyCartResp) {}\n}\n\nmessage CartItem {\n  uint32 product_id = 1;\n  int32  quantity = 2;\n}\n\nmessage AddItemReq {\n  uint32 user_id = 1;\n  CartItem item = 2;\n}\n\nmessage AddItemResp {}\n\nmessage EmptyCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartResp {\n  Cart cart = 1;\n}\n\nmessage Cart {\n  uint32 user_id = 1;\n  repeated CartItem items = 2;\n}\n\nmessage EmptyCartResp {}\n"
  },
  {
    "path": "gomall/tutorial/ch16/idl/checkout.proto",
    "content": "syntax = \"proto3\";\n\npackage  checkout;\n\nimport \"payment.proto\";\n\noption go_package = \"/checkout\";\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (CheckoutResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  string zip_code = 5;\n}\n\nmessage CheckoutReq {\n  uint32 user_id = 1;\n  string firstname = 2;\n  string lastname = 3;\n  string email = 4;\n  Address address = 5;\n  payment.CreditCardInfo credit_card = 6;\n}\n\nmessage CheckoutResp {\n  string order_id = 1;\n  string transaction_id = 2;\n}"
  },
  {
    "path": "gomall/tutorial/ch16/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch16/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch16/idl/email.proto",
    "content": "syntax = \"proto3\";\n\npackage email;\n\noption go_package = \"/email\";\n\nmessage EmailReq{\n  string from = 1;\n  string to = 2;\n  string content_type = 3;\n  string subject = 4;\n  string content = 5;\n}\n\nmessage EmailResp {\n\n}\n\nservice EmailService{\n  rpc Send(EmailReq) returns (EmailResp);\n}"
  },
  {
    "path": "gomall/tutorial/ch16/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\noption go_package = \"/frontend/auth\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage RegisterReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string confirm_password = 3 [(api.form) = \"confirm_password\"];\n}\n\nmessage LoginReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string next = 3 [(api.query) = \"next\"];\n}\n\nservice AuthService {\n  rpc register(RegisterReq) returns (common.Empty) {\n    option (api.post) = \"/auth/register\";\n  }\n  rpc login(LoginReq) returns (common.Empty) {\n    option (api.post) = \"/auth/login\";\n  }\n  rpc logout(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/auth/logout\";\n  }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/idl/frontend/cart_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.cart;\n\noption go_package = \"/frontend/cart\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage AddCartReq {\n  uint32 product_id = 1 [(api.form) = \"productId\"];\n  int32 product_num = 2 [(api.form) = \"productNum\"];\n}\n\nservice CartService {\n  rpc AddCartItem(AddCartReq) returns (common.Empty) {\n    option (api.post) = \"/cart\";\n  }\n  rpc GetCart(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/cart\";\n  }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/idl/frontend/category_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.category;\n\noption go_package = \"/frontend/category\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CategoryReq { string category = 1 [(api.path)=\"category\"]; }\n\nservice CategoryService {\n  rpc Category(CategoryReq) returns (common.Empty) {\n    option (api.get) = \"/category/:category\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch16/idl/frontend/checkout_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.checkout;\n\noption go_package = \"/frontend/checkout\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CheckoutReq {\n  string email = 1 [(api.form) = \"email\"];\n  string firstname = 2 [(api.form) = \"firstname\"];\n  string lastname = 3 [(api.form) = \"lastname\"];\n  string street = 4 [(api.form) = \"street\"];\n  string zipcode = 5 [(api.form) = \"zipcode\"];\n  string province = 6 [(api.form) = \"province\"];\n  string country = 7 [(api.form) = \"country\"];\n  string city = 8 [(api.form) = \"city\"];\n  string card_num = 9 [(api.form) = \"cardNum\"];\n  int32 expiration_month = 10 [(api.form) = \"expirationMonth\"];\n  int32 expiration_year = 11 [(api.form) = \"expirationYear\"];\n  int32 cvv = 12 [(api.form) = \"cvv\"];\n  string payment = 13 [(api.form) = \"payment\"];\n}\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (common.Empty) {\n    option (api.get) = \"/checkout\";\n  }\n  rpc CheckoutWaiting(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/checkout/waiting\";\n  }\n  rpc CheckoutResult(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/checkout/result\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch16/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\nmessage Empty {}"
  },
  {
    "path": "gomall/tutorial/ch16/idl/frontend/home.proto",
    "content": "syntax = 'proto3';\n\npackage frontend.common;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/home\";\n\nservice HomeService {\n  rpc Home(common.Empty) returns (Empty) { option (api.get) = \"/\"; }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/idl/frontend/order_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.order;\n\noption go_package = \"/frontend/order\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nservice OrderService {\n  rpc OrderList(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/order\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch16/idl/frontend/product_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.product;\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\noption go_package = \"frontend/product\";\n\nmessage ProductReq { uint32 id = 1 [ (api.query) = \"id\" ]; }\n\nservice ProductService {\n  rpc GetProduct(ProductReq) returns (common.Empty) {\n    option (api.get) = \"/product\";\n  };\n}"
  },
  {
    "path": "gomall/tutorial/ch16/idl/order.proto",
    "content": "syntax = \"proto3\";\n\npackage order;\n\nimport \"cart.proto\";\n\noption go_package = \"order\";\n\nservice OrderService {\n  rpc PlaceOrder(PlaceOrderReq) returns (PlaceOrderResp) {}\n  rpc ListOrder(ListOrderReq) returns (ListOrderResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  int32 zip_code = 5;\n}\n\nmessage PlaceOrderReq {\n  uint32 user_id = 1;\n  string user_currency = 2;\n\n  Address address = 3;\n  string email = 4;\n  repeated OrderItem order_items = 5;\n}\n\nmessage OrderItem {\n  cart.CartItem item = 1;\n  float cost = 2;\n}\n\nmessage OrderResult {\n  string order_id = 1;\n}\n\nmessage PlaceOrderResp {\n  OrderResult order = 1;\n}\n\nmessage ListOrderReq {\n  uint32 user_id = 1;\n}\n\nmessage Order {\n  repeated OrderItem order_items = 1;\n  string order_id = 2;\n  uint32 user_id = 3;\n  string user_currency = 4;\n  Address address = 5;\n  string email = 6;\n  int32 created_at = 7;\n}\n\nmessage ListOrderResp {\n  repeated Order orders = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/idl/payment.proto",
    "content": "syntax = \"proto3\";\n\npackage payment;\n\noption go_package = \"payment\";\n\n\nservice PaymentService {\n  rpc Charge(ChargeReq) returns (ChargeResp) {}\n}\n\nmessage CreditCardInfo {\n  string credit_card_number = 1;\n  int32 credit_card_cvv = 2;\n  int32 credit_card_expiration_year = 3;\n  int32 credit_card_expiration_month = 4;\n}\n\nmessage ChargeReq {\n  float amount = 1;\n  CreditCardInfo credit_card = 2;\n  string order_id = 3;\n  uint32 user_id = 4;\n}\n\nmessage ChargeResp {\n  string transaction_id = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/idl/product.proto",
    "content": "syntax = \"proto3\";\n\npackage product;\n\noption go_package = \"/product\";\n\nservice ProductCatalogService {\n  rpc ListProducts(ListProductsReq) returns (ListProductsResp) {}\n  rpc GetProduct(GetProductReq) returns (GetProductResp) {}\n  rpc SearchProducts(SearchProductsReq) returns (SearchProductsResp) {}\n}\n\nmessage ListProductsReq{\n  int32 page = 1;\n  int64 pageSize = 2;\n\n  string categoryName = 3;\n}\n\nmessage Product {\n  uint32 id = 1;\n  string name = 2;\n  string description = 3;\n  string picture = 4;\n  float price = 5;\n\n  repeated string categories = 6;\n}\n\nmessage ListProductsResp {\n  repeated Product products = 1;\n}\n\nmessage GetProductReq {\n  uint32 id = 1;\n}\n\nmessage GetProductResp {\n  Product product = 1;\n}\n\nmessage SearchProductsReq {\n  string query = 1;\n}\n\nmessage SearchProductsResp {\n  repeated Product results = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/idl/user.proto",
    "content": "syntax=\"proto3\";\n\npackage user;\n\noption go_package=\"/user\";\n\nservice UserService {\n    rpc Register(RegisterReq) returns (RegisterResp) {}\n    rpc Login(LoginReq) returns (LoginResp) {}\n}\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string confirm_password = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email= 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.5\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgoogle.golang.org/protobuf v1.36.6\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/cart/cart.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CartItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CartItem[number], err)\n}\n\nfunc (x *CartItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.ProductId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CartItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Quantity, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_AddItemReq[number], err)\n}\n\nfunc (x *AddItemReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *AddItemResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmptyCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmptyCartReq[number], err)\n}\n\nfunc (x *EmptyCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartReq[number], err)\n}\n\nfunc (x *GetCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartResp[number], err)\n}\n\nfunc (x *GetCartResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Cart\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Cart = &v\n\treturn offset, nil\n}\n\nfunc (x *Cart) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Cart[number], err)\n}\n\nfunc (x *Cart) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Cart) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *EmptyCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *CartItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.ProductId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetProductId())\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Quantity == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetQuantity())\n\treturn offset\n}\n\nfunc (x *AddItemReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItem())\n\treturn offset\n}\n\nfunc (x *AddItemResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Cart == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetCart())\n\treturn offset\n}\n\nfunc (x *Cart) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField2(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *CartItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CartItem) sizeField1() (n int) {\n\tif x.ProductId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetProductId())\n\treturn n\n}\n\nfunc (x *CartItem) sizeField2() (n int) {\n\tif x.Quantity == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetQuantity())\n\treturn n\n}\n\nfunc (x *AddItemReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField2() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetItem())\n\treturn n\n}\n\nfunc (x *AddItemResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *EmptyCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartResp) sizeField1() (n int) {\n\tif x.Cart == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetCart())\n\treturn n\n}\n\nfunc (x *Cart) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *Cart) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Cart) sizeField2() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(2, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_CartItem = map[int32]string{\n\t1: \"ProductId\",\n\t2: \"Quantity\",\n}\n\nvar fieldIDToName_AddItemReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Item\",\n}\n\nvar fieldIDToName_AddItemResp = map[int32]string{}\n\nvar fieldIDToName_EmptyCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartResp = map[int32]string{\n\t1: \"Cart\",\n}\n\nvar fieldIDToName_Cart = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Items\",\n}\n\nvar fieldIDToName_EmptyCartResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/cart/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: cart.proto\n\npackage cart\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\"`\n\tQuantity  int32  `protobuf:\"varint,2,opt,name=quantity,proto3\" json:\"quantity,omitempty\"`\n}\n\nfunc (x *CartItem) Reset() {\n\t*x = CartItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartItem) ProtoMessage() {}\n\nfunc (x *CartItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartItem.ProtoReflect.Descriptor instead.\nfunc (*CartItem) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartItem) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetQuantity() int32 {\n\tif x != nil {\n\t\treturn x.Quantity\n\t}\n\treturn 0\n}\n\ntype AddItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32    `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItem   *CartItem `protobuf:\"bytes,2,opt,name=item,proto3\" json:\"item,omitempty\"`\n}\n\nfunc (x *AddItemReq) Reset() {\n\t*x = AddItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemReq) ProtoMessage() {}\n\nfunc (x *AddItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddItemReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *AddItemReq) GetItem() *CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\ntype AddItemResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *AddItemResp) Reset() {\n\t*x = AddItemResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemResp) ProtoMessage() {}\n\nfunc (x *AddItemResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemResp.ProtoReflect.Descriptor instead.\nfunc (*AddItemResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{2}\n}\n\ntype EmptyCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *EmptyCartReq) Reset() {\n\t*x = EmptyCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartReq) ProtoMessage() {}\n\nfunc (x *EmptyCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartReq.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EmptyCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *GetCartReq) Reset() {\n\t*x = GetCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReq) ProtoMessage() {}\n\nfunc (x *GetCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReq.ProtoReflect.Descriptor instead.\nfunc (*GetCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCart *Cart `protobuf:\"bytes,1,opt,name=cart,proto3\" json:\"cart,omitempty\"`\n}\n\nfunc (x *GetCartResp) Reset() {\n\t*x = GetCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartResp) ProtoMessage() {}\n\nfunc (x *GetCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartResp.ProtoReflect.Descriptor instead.\nfunc (*GetCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *GetCartResp) GetCart() *Cart {\n\tif x != nil {\n\t\treturn x.Cart\n\t}\n\treturn nil\n}\n\ntype Cart struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32      `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItems  []*CartItem `protobuf:\"bytes,2,rep,name=items,proto3\" json:\"items,omitempty\"`\n}\n\nfunc (x *Cart) Reset() {\n\t*x = Cart{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Cart) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Cart) ProtoMessage() {}\n\nfunc (x *Cart) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Cart.ProtoReflect.Descriptor instead.\nfunc (*Cart) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Cart) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Cart) GetItems() []*CartItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\ntype EmptyCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmptyCartResp) Reset() {\n\t*x = EmptyCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartResp) ProtoMessage() {}\n\nfunc (x *EmptyCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartResp.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{7}\n}\n\nvar File_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x08, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0a, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04,\n\t0x69, 0x74, 0x65, 0x6d, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x27, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0a,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x1e, 0x0a, 0x04, 0x63, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x52, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x04, 0x43, 0x61, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74,\n\t0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x45, 0x6d, 0x70,\n\t0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x32, 0xa9, 0x01, 0x0a, 0x0b, 0x43,\n\t0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x47,\n\t0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36,\n\t0x0a, 0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x12, 0x12, 0x2e, 0x63, 0x61,\n\t0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a,\n\t0x13, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62,\n\t0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72,\n\t0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_proto_rawDescOnce sync.Once\n\tfile_cart_proto_rawDescData = file_cart_proto_rawDesc\n)\n\nfunc file_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_proto_rawDescData)\n\t})\n\treturn file_cart_proto_rawDescData\n}\n\nvar file_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_cart_proto_goTypes = []interface{}{\n\t(*CartItem)(nil),      // 0: cart.CartItem\n\t(*AddItemReq)(nil),    // 1: cart.AddItemReq\n\t(*AddItemResp)(nil),   // 2: cart.AddItemResp\n\t(*EmptyCartReq)(nil),  // 3: cart.EmptyCartReq\n\t(*GetCartReq)(nil),    // 4: cart.GetCartReq\n\t(*GetCartResp)(nil),   // 5: cart.GetCartResp\n\t(*Cart)(nil),          // 6: cart.Cart\n\t(*EmptyCartResp)(nil), // 7: cart.EmptyCartResp\n}\nvar file_cart_proto_depIdxs = []int32{\n\t0, // 0: cart.AddItemReq.item:type_name -> cart.CartItem\n\t6, // 1: cart.GetCartResp.cart:type_name -> cart.Cart\n\t0, // 2: cart.Cart.items:type_name -> cart.CartItem\n\t1, // 3: cart.CartService.AddItem:input_type -> cart.AddItemReq\n\t4, // 4: cart.CartService.GetCart:input_type -> cart.GetCartReq\n\t3, // 5: cart.CartService.EmptyCart:input_type -> cart.EmptyCartReq\n\t2, // 6: cart.CartService.AddItem:output_type -> cart.AddItemResp\n\t5, // 7: cart.CartService.GetCart:output_type -> cart.GetCartResp\n\t7, // 8: cart.CartService.EmptyCart:output_type -> cart.EmptyCartResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_proto_init() }\nfunc file_cart_proto_init() {\n\tif File_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Cart); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_proto = out.File\n\tfile_cart_proto_rawDesc = nil\n\tfile_cart_proto_goTypes = nil\n\tfile_cart_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CartService interface {\n\tAddItem(ctx context.Context, req *AddItemReq) (res *AddItemResp, err error)\n\tGetCart(ctx context.Context, req *GetCartReq) (res *GetCartResp, err error)\n\tEmptyCart(ctx context.Context, req *EmptyCartReq) (res *EmptyCartResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/cart/cartservice/cartservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfo\n}\n\nvar cartServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CartService\"\n\thandlerType := (*cart.CartService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"AddItem\":   kitex.NewMethodInfo(addItemHandler, newAddItemArgs, newAddItemResult, false),\n\t\t\"GetCart\":   kitex.NewMethodInfo(getCartHandler, newGetCartArgs, newGetCartResult, false),\n\t\t\"EmptyCart\": kitex.NewMethodInfo(emptyCartHandler, newEmptyCartArgs, newEmptyCartResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"cart\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc addItemHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.AddItemReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).AddItem(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *AddItemArgs:\n\t\tsuccess, err := handler.(cart.CartService).AddItem(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*AddItemResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newAddItemArgs() interface{} {\n\treturn &AddItemArgs{}\n}\n\nfunc newAddItemResult() interface{} {\n\treturn &AddItemResult{}\n}\n\ntype AddItemArgs struct {\n\tReq *cart.AddItemReq\n}\n\nfunc (p *AddItemArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.AddItemReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *AddItemArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *AddItemArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *AddItemArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar AddItemArgs_Req_DEFAULT *cart.AddItemReq\n\nfunc (p *AddItemArgs) GetReq() *cart.AddItemReq {\n\tif !p.IsSetReq() {\n\t\treturn AddItemArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *AddItemArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *AddItemArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype AddItemResult struct {\n\tSuccess *cart.AddItemResp\n}\n\nvar AddItemResult_Success_DEFAULT *cart.AddItemResp\n\nfunc (p *AddItemResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.AddItemResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *AddItemResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *AddItemResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *AddItemResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *AddItemResult) GetSuccess() *cart.AddItemResp {\n\tif !p.IsSetSuccess() {\n\t\treturn AddItemResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *AddItemResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.AddItemResp)\n}\n\nfunc (p *AddItemResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *AddItemResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.GetCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).GetCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).GetCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetCartArgs() interface{} {\n\treturn &GetCartArgs{}\n}\n\nfunc newGetCartResult() interface{} {\n\treturn &GetCartResult{}\n}\n\ntype GetCartArgs struct {\n\tReq *cart.GetCartReq\n}\n\nfunc (p *GetCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.GetCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetCartArgs_Req_DEFAULT *cart.GetCartReq\n\nfunc (p *GetCartArgs) GetReq() *cart.GetCartReq {\n\tif !p.IsSetReq() {\n\t\treturn GetCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetCartResult struct {\n\tSuccess *cart.GetCartResp\n}\n\nvar GetCartResult_Success_DEFAULT *cart.GetCartResp\n\nfunc (p *GetCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.GetCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetCartResult) GetSuccess() *cart.GetCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.GetCartResp)\n}\n\nfunc (p *GetCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc emptyCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.EmptyCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).EmptyCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EmptyCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).EmptyCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EmptyCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEmptyCartArgs() interface{} {\n\treturn &EmptyCartArgs{}\n}\n\nfunc newEmptyCartResult() interface{} {\n\treturn &EmptyCartResult{}\n}\n\ntype EmptyCartArgs struct {\n\tReq *cart.EmptyCartReq\n}\n\nfunc (p *EmptyCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.EmptyCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EmptyCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EmptyCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EmptyCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EmptyCartArgs_Req_DEFAULT *cart.EmptyCartReq\n\nfunc (p *EmptyCartArgs) GetReq() *cart.EmptyCartReq {\n\tif !p.IsSetReq() {\n\t\treturn EmptyCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EmptyCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EmptyCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EmptyCartResult struct {\n\tSuccess *cart.EmptyCartResp\n}\n\nvar EmptyCartResult_Success_DEFAULT *cart.EmptyCartResp\n\nfunc (p *EmptyCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.EmptyCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EmptyCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EmptyCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EmptyCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EmptyCartResult) GetSuccess() *cart.EmptyCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn EmptyCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EmptyCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.EmptyCartResp)\n}\n\nfunc (p *EmptyCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EmptyCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) AddItem(ctx context.Context, Req *cart.AddItemReq) (r *cart.AddItemResp, err error) {\n\tvar _args AddItemArgs\n\t_args.Req = Req\n\tvar _result AddItemResult\n\tif err = p.c.Call(ctx, \"AddItem\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetCart(ctx context.Context, Req *cart.GetCartReq) (r *cart.GetCartResp, err error) {\n\tvar _args GetCartArgs\n\t_args.Req = Req\n\tvar _result GetCartResult\n\tif err = p.c.Call(ctx, \"GetCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq) (r *cart.EmptyCartResp, err error) {\n\tvar _args EmptyCartArgs\n\t_args.Req = Req\n\tvar _result EmptyCartResult\n\tif err = p.c.Call(ctx, \"EmptyCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/cart/cartservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCartServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCartServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCartServiceClient) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.AddItem(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetCart(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.EmptyCart(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/cart/cartservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler cart.CartService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/cart/cartservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler cart.CartService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/checkout/checkout.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tfmt \"fmt\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutReq[number], err)\n}\n\nfunc (x *CheckoutReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Firstname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Lastname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutReq) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v payment.CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutResp[number], err)\n}\n\nfunc (x *CheckoutResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutResp) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Firstname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetFirstname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Lastname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetLastname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField6(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 6, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField2(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *CheckoutReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField2() (n int) {\n\tif x.Firstname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetFirstname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField3() (n int) {\n\tif x.Lastname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetLastname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField6() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(6, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *CheckoutResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField2() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_CheckoutReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Firstname\",\n\t3: \"Lastname\",\n\t4: \"Email\",\n\t5: \"Address\",\n\t6: \"CreditCard\",\n}\n\nvar fieldIDToName_CheckoutResp = map[int32]string{\n\t1: \"OrderId\",\n\t2: \"TransactionId\",\n}\n\nvar _ = payment.File_payment_proto\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/checkout/checkout.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: checkout.proto\n\npackage checkout\n\nimport (\n\tcontext \"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       string `protobuf:\"bytes,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() string {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn \"\"\n}\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId     uint32                  `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tFirstname  string                  `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\"`\n\tLastname   string                  `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\"`\n\tEmail      string                  `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tAddress    *Address                `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tCreditCard *payment.CreditCardInfo `protobuf:\"bytes,6,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CheckoutReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *CheckoutReq) GetCreditCard() *payment.CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\ntype CheckoutResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId       string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tTransactionId string `protobuf:\"bytes,2,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *CheckoutResp) Reset() {\n\t*x = CheckoutResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutResp) ProtoMessage() {}\n\nfunc (x *CheckoutResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutResp.ProtoReflect.Descriptor instead.\nfunc (*CheckoutResp) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CheckoutResp) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_proto protoreflect.FileDescriptor\n\nvar file_checkout_proto_rawDesc = []byte{\n\t0x0a, 0x0e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x0d, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f,\n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,\n\t0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,\n\t0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79,\n\t0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x0b,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75,\n\t0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73,\n\t0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x22, 0x50, 0x0a, 0x0c, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,\n\t0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x4e, 0x0a,\n\t0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x3b, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x15, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_proto_rawDescOnce sync.Once\n\tfile_checkout_proto_rawDescData = file_checkout_proto_rawDesc\n)\n\nfunc file_checkout_proto_rawDescGZIP() []byte {\n\tfile_checkout_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_proto_rawDescData)\n\t})\n\treturn file_checkout_proto_rawDescData\n}\n\nvar file_checkout_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_checkout_proto_goTypes = []interface{}{\n\t(*Address)(nil),                // 0: checkout.Address\n\t(*CheckoutReq)(nil),            // 1: checkout.CheckoutReq\n\t(*CheckoutResp)(nil),           // 2: checkout.CheckoutResp\n\t(*payment.CreditCardInfo)(nil), // 3: payment.CreditCardInfo\n}\nvar file_checkout_proto_depIdxs = []int32{\n\t0, // 0: checkout.CheckoutReq.address:type_name -> checkout.Address\n\t3, // 1: checkout.CheckoutReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 2: checkout.CheckoutService.Checkout:input_type -> checkout.CheckoutReq\n\t2, // 3: checkout.CheckoutService.Checkout:output_type -> checkout.CheckoutResp\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_proto_init() }\nfunc file_checkout_proto_init() {\n\tif File_checkout_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_proto = out.File\n\tfile_checkout_proto_rawDesc = nil\n\tfile_checkout_proto_goTypes = nil\n\tfile_checkout_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CheckoutService interface {\n\tCheckout(ctx context.Context, req *CheckoutReq) (res *CheckoutResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/checkout/checkoutservice/checkoutservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfo\n}\n\nvar checkoutServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CheckoutService\"\n\thandlerType := (*checkout.CheckoutService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Checkout\": kitex.NewMethodInfo(checkoutHandler, newCheckoutArgs, newCheckoutResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"checkout\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc checkoutHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(checkout.CheckoutReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(checkout.CheckoutService).Checkout(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *CheckoutArgs:\n\t\tsuccess, err := handler.(checkout.CheckoutService).Checkout(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*CheckoutResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newCheckoutArgs() interface{} {\n\treturn &CheckoutArgs{}\n}\n\nfunc newCheckoutResult() interface{} {\n\treturn &CheckoutResult{}\n}\n\ntype CheckoutArgs struct {\n\tReq *checkout.CheckoutReq\n}\n\nfunc (p *CheckoutArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(checkout.CheckoutReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *CheckoutArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *CheckoutArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *CheckoutArgs) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar CheckoutArgs_Req_DEFAULT *checkout.CheckoutReq\n\nfunc (p *CheckoutArgs) GetReq() *checkout.CheckoutReq {\n\tif !p.IsSetReq() {\n\t\treturn CheckoutArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *CheckoutArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *CheckoutArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype CheckoutResult struct {\n\tSuccess *checkout.CheckoutResp\n}\n\nvar CheckoutResult_Success_DEFAULT *checkout.CheckoutResp\n\nfunc (p *CheckoutResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(checkout.CheckoutResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *CheckoutResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *CheckoutResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *CheckoutResult) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *CheckoutResult) GetSuccess() *checkout.CheckoutResp {\n\tif !p.IsSetSuccess() {\n\t\treturn CheckoutResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *CheckoutResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*checkout.CheckoutResp)\n}\n\nfunc (p *CheckoutResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *CheckoutResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq) (r *checkout.CheckoutResp, err error) {\n\tvar _args CheckoutArgs\n\t_args.Req = Req\n\tvar _result CheckoutResult\n\tif err = p.c.Call(ctx, \"Checkout\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/checkout/checkoutservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCheckoutServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCheckoutServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCheckoutServiceClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Checkout(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/checkout/checkoutservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler checkout.CheckoutService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/checkout/checkoutservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler checkout.CheckoutService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/email/email.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage email\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *EmailReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmailReq[number], err)\n}\n\nfunc (x *EmailReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.From, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.To, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ContentType, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Subject, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Content, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmailReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.From == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetFrom())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.To == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTo())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ContentType == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetContentType())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Subject == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetSubject())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Content == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetContent())\n\treturn offset\n}\n\nfunc (x *EmailResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmailReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField1() (n int) {\n\tif x.From == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetFrom())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField2() (n int) {\n\tif x.To == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTo())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField3() (n int) {\n\tif x.ContentType == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetContentType())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField4() (n int) {\n\tif x.Subject == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetSubject())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField5() (n int) {\n\tif x.Content == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetContent())\n\treturn n\n}\n\nfunc (x *EmailResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_EmailReq = map[int32]string{\n\t1: \"From\",\n\t2: \"To\",\n\t3: \"ContentType\",\n\t4: \"Subject\",\n\t5: \"Content\",\n}\n\nvar fieldIDToName_EmailResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/email/email.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: email.proto\n\npackage email\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype EmailReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFrom        string `protobuf:\"bytes,1,opt,name=from,proto3\" json:\"from,omitempty\"`\n\tTo          string `protobuf:\"bytes,2,opt,name=to,proto3\" json:\"to,omitempty\"`\n\tContentType string `protobuf:\"bytes,3,opt,name=content_type,json=contentType,proto3\" json:\"content_type,omitempty\"`\n\tSubject     string `protobuf:\"bytes,4,opt,name=subject,proto3\" json:\"subject,omitempty\"`\n\tContent     string `protobuf:\"bytes,5,opt,name=content,proto3\" json:\"content,omitempty\"`\n}\n\nfunc (x *EmailReq) Reset() {\n\t*x = EmailReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailReq) ProtoMessage() {}\n\nfunc (x *EmailReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailReq.ProtoReflect.Descriptor instead.\nfunc (*EmailReq) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *EmailReq) GetFrom() string {\n\tif x != nil {\n\t\treturn x.From\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetTo() string {\n\tif x != nil {\n\t\treturn x.To\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContentType() string {\n\tif x != nil {\n\t\treturn x.ContentType\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetSubject() string {\n\tif x != nil {\n\t\treturn x.Subject\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\ntype EmailResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmailResp) Reset() {\n\t*x = EmailResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailResp) ProtoMessage() {}\n\nfunc (x *EmailResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailResp.ProtoReflect.Descriptor instead.\nfunc (*EmailResp) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{1}\n}\n\nvar File_email_proto protoreflect.FileDescriptor\n\nvar file_email_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x08, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65,\n\t0x71, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x0b, 0x0a, 0x09,\n\t0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x32, 0x39, 0x0a, 0x0c, 0x45, 0x6d, 0x61,\n\t0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x53, 0x65, 0x6e,\n\t0x64, 0x12, 0x0f, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52,\n\t0x65, 0x71, 0x1a, 0x10, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c,\n\t0x52, 0x65, 0x73, 0x70, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63,\n\t0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_email_proto_rawDescOnce sync.Once\n\tfile_email_proto_rawDescData = file_email_proto_rawDesc\n)\n\nfunc file_email_proto_rawDescGZIP() []byte {\n\tfile_email_proto_rawDescOnce.Do(func() {\n\t\tfile_email_proto_rawDescData = protoimpl.X.CompressGZIP(file_email_proto_rawDescData)\n\t})\n\treturn file_email_proto_rawDescData\n}\n\nvar file_email_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_email_proto_goTypes = []interface{}{\n\t(*EmailReq)(nil),  // 0: email.EmailReq\n\t(*EmailResp)(nil), // 1: email.EmailResp\n}\nvar file_email_proto_depIdxs = []int32{\n\t0, // 0: email.EmailService.Send:input_type -> email.EmailReq\n\t1, // 1: email.EmailService.Send:output_type -> email.EmailResp\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_email_proto_init() }\nfunc file_email_proto_init() {\n\tif File_email_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_email_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_email_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_email_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_email_proto_goTypes,\n\t\tDependencyIndexes: file_email_proto_depIdxs,\n\t\tMessageInfos:      file_email_proto_msgTypes,\n\t}.Build()\n\tFile_email_proto = out.File\n\tfile_email_proto_rawDesc = nil\n\tfile_email_proto_goTypes = nil\n\tfile_email_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype EmailService interface {\n\tSend(ctx context.Context, req *EmailReq) (res *EmailResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/email/emailservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEmailServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEmailServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kEmailServiceClient) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Send(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/email/emailservice/emailservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn emailServiceServiceInfo\n}\n\nvar emailServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"EmailService\"\n\thandlerType := (*email.EmailService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Send\": kitex.NewMethodInfo(sendHandler, newSendArgs, newSendResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"email\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc sendHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(email.EmailReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(email.EmailService).Send(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SendArgs:\n\t\tsuccess, err := handler.(email.EmailService).Send(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SendResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSendArgs() interface{} {\n\treturn &SendArgs{}\n}\n\nfunc newSendResult() interface{} {\n\treturn &SendResult{}\n}\n\ntype SendArgs struct {\n\tReq *email.EmailReq\n}\n\nfunc (p *SendArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(email.EmailReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SendArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SendArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SendArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SendArgs) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SendArgs_Req_DEFAULT *email.EmailReq\n\nfunc (p *SendArgs) GetReq() *email.EmailReq {\n\tif !p.IsSetReq() {\n\t\treturn SendArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SendArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SendArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SendResult struct {\n\tSuccess *email.EmailResp\n}\n\nvar SendResult_Success_DEFAULT *email.EmailResp\n\nfunc (p *SendResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(email.EmailResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SendResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SendResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SendResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SendResult) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SendResult) GetSuccess() *email.EmailResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SendResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SendResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*email.EmailResp)\n}\n\nfunc (p *SendResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SendResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Send(ctx context.Context, Req *email.EmailReq) (r *email.EmailResp, err error) {\n\tvar _args SendArgs\n\t_args.Req = Req\n\tvar _result SendResult\n\tif err = p.c.Call(ctx, \"Send\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/email/emailservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler email.EmailService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/email/emailservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler email.EmailService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/order/order.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage order\n\nimport (\n\tfmt \"fmt\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderReq[number], err)\n}\n\nfunc (x *PlaceOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *PlaceOrderReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderItem[number], err)\n}\n\nfunc (x *OrderItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v cart.CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Cost, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *OrderResult) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderResult[number], err)\n}\n\nfunc (x *OrderResult) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderResp[number], err)\n}\n\nfunc (x *PlaceOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderResult\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Order = &v\n\treturn offset, nil\n}\n\nfunc (x *ListOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderReq[number], err)\n}\n\nfunc (x *ListOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 7:\n\t\toffset, err = x.fastReadField7(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Order[number], err)\n}\n\nfunc (x *Order) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField7(buf []byte, _type int8) (offset int, err error) {\n\tx.CreatedAt, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderResp[number], err)\n}\n\nfunc (x *ListOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Order\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Orders = append(x.Orders, &v)\n\treturn offset, nil\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 3, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *OrderItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItem())\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Cost == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 2, x.GetCost())\n\treturn offset\n}\n\nfunc (x *OrderResult) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderResult) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Order == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrder())\n\treturn offset\n}\n\nfunc (x *ListOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\toffset += x.fastWriteField7(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField2(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField3(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 3, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField6(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 6, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField7(buf []byte) (offset int) {\n\tif x.CreatedAt == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 7, x.GetCreatedAt())\n\treturn offset\n}\n\nfunc (x *ListOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Orders == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrders() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrders()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField2() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField3() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(3, x.GetAddress())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField5() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(5, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *OrderItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField1() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetItem())\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField2() (n int) {\n\tif x.Cost == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(2, x.GetCost())\n\treturn n\n}\n\nfunc (x *OrderResult) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *OrderResult) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) sizeField1() (n int) {\n\tif x.Order == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetOrder())\n\treturn n\n}\n\nfunc (x *ListOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\tn += x.sizeField7()\n\treturn n\n}\n\nfunc (x *Order) sizeField1() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *Order) sizeField2() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *Order) sizeField3() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(3, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) sizeField4() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *Order) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *Order) sizeField6() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(6, x.GetEmail())\n\treturn n\n}\n\nfunc (x *Order) sizeField7() (n int) {\n\tif x.CreatedAt == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(7, x.GetCreatedAt())\n\treturn n\n}\n\nfunc (x *ListOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderResp) sizeField1() (n int) {\n\tif x.Orders == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrders() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrders()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_PlaceOrderReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"UserCurrency\",\n\t3: \"Address\",\n\t4: \"Email\",\n\t5: \"OrderItems\",\n}\n\nvar fieldIDToName_OrderItem = map[int32]string{\n\t1: \"Item\",\n\t2: \"Cost\",\n}\n\nvar fieldIDToName_OrderResult = map[int32]string{\n\t1: \"OrderId\",\n}\n\nvar fieldIDToName_PlaceOrderResp = map[int32]string{\n\t1: \"Order\",\n}\n\nvar fieldIDToName_ListOrderReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_Order = map[int32]string{\n\t1: \"OrderItems\",\n\t2: \"OrderId\",\n\t3: \"UserId\",\n\t4: \"UserCurrency\",\n\t5: \"Address\",\n\t6: \"Email\",\n\t7: \"CreatedAt\",\n}\n\nvar fieldIDToName_ListOrderResp = map[int32]string{\n\t1: \"Orders\",\n}\n\nvar _ = cart.File_cart_proto\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/order/order.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: order.proto\n\npackage order\n\nimport (\n\tcontext \"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       int32  `protobuf:\"varint,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() int32 {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn 0\n}\n\ntype PlaceOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId       uint32       `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,2,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,3,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tOrderItems   []*OrderItem `protobuf:\"bytes,5,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n}\n\nfunc (x *PlaceOrderReq) Reset() {\n\t*x = PlaceOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderReq) ProtoMessage() {}\n\nfunc (x *PlaceOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderReq.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *PlaceOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *PlaceOrderReq) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *PlaceOrderReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\ntype OrderItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItem *cart.CartItem `protobuf:\"bytes,1,opt,name=item,proto3\" json:\"item,omitempty\"`\n\tCost float32        `protobuf:\"fixed32,2,opt,name=cost,proto3\" json:\"cost,omitempty\"`\n}\n\nfunc (x *OrderItem) Reset() {\n\t*x = OrderItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderItem) ProtoMessage() {}\n\nfunc (x *OrderItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderItem.ProtoReflect.Descriptor instead.\nfunc (*OrderItem) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *OrderItem) GetItem() *cart.CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\nfunc (x *OrderItem) GetCost() float32 {\n\tif x != nil {\n\t\treturn x.Cost\n\t}\n\treturn 0\n}\n\ntype OrderResult struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n}\n\nfunc (x *OrderResult) Reset() {\n\t*x = OrderResult{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderResult) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderResult) ProtoMessage() {}\n\nfunc (x *OrderResult) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderResult.ProtoReflect.Descriptor instead.\nfunc (*OrderResult) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *OrderResult) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\ntype PlaceOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrder *OrderResult `protobuf:\"bytes,1,opt,name=order,proto3\" json:\"order,omitempty\"`\n}\n\nfunc (x *PlaceOrderResp) Reset() {\n\t*x = PlaceOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderResp) ProtoMessage() {}\n\nfunc (x *PlaceOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderResp.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PlaceOrderResp) GetOrder() *OrderResult {\n\tif x != nil {\n\t\treturn x.Order\n\t}\n\treturn nil\n}\n\ntype ListOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ListOrderReq) Reset() {\n\t*x = ListOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderReq) ProtoMessage() {}\n\nfunc (x *ListOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderReq.ProtoReflect.Descriptor instead.\nfunc (*ListOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ListOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype Order struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderItems   []*OrderItem `protobuf:\"bytes,1,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n\tOrderId      string       `protobuf:\"bytes,2,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId       uint32       `protobuf:\"varint,3,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,4,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,6,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tCreatedAt    int32        `protobuf:\"varint,7,opt,name=created_at,json=createdAt,proto3\" json:\"created_at,omitempty\"`\n}\n\nfunc (x *Order) Reset() {\n\t*x = Order{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Order) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Order) ProtoMessage() {}\n\nfunc (x *Order) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Order.ProtoReflect.Descriptor instead.\nfunc (*Order) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Order) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Order) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetCreatedAt() int32 {\n\tif x != nil {\n\t\treturn x.CreatedAt\n\t}\n\treturn 0\n}\n\ntype ListOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrders []*Order `protobuf:\"bytes,1,rep,name=orders,proto3\" json:\"orders,omitempty\"`\n}\n\nfunc (x *ListOrderResp) Reset() {\n\t*x = ListOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderResp) ProtoMessage() {}\n\nfunc (x *ListOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderResp.ProtoReflect.Descriptor instead.\nfunc (*ListOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ListOrderResp) GetOrders() []*Order {\n\tif x != nil {\n\t\treturn x.Orders\n\t}\n\treturn nil\n}\n\nvar File_order_proto protoreflect.FileDescriptor\n\nvar file_order_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x1a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a,\n\t0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,\n\t0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63,\n\t0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f,\n\t0x64, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65,\n\t0x72, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a,\n\t0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e,\n\t0x63, 0x79, 0x12, 0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05,\n\t0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d,\n\t0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e,\n\t0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x43, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74,\n\t0x65, 0x6d, 0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d,\n\t0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x28, 0x0a, 0x0b, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x22, 0x27, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf2, 0x01, 0x0a, 0x05, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65,\n\t0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65,\n\t0x72, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49,\n\t0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12,\n\t0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x35,\n\t0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12,\n\t0x24, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x0c, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x73, 0x32, 0x85, 0x01, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f,\n\t0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61,\n\t0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73,\n\t0x70, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72,\n\t0x12, 0x13, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3e, 0x5a,\n\t0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_order_proto_rawDescOnce sync.Once\n\tfile_order_proto_rawDescData = file_order_proto_rawDesc\n)\n\nfunc file_order_proto_rawDescGZIP() []byte {\n\tfile_order_proto_rawDescOnce.Do(func() {\n\t\tfile_order_proto_rawDescData = protoimpl.X.CompressGZIP(file_order_proto_rawDescData)\n\t})\n\treturn file_order_proto_rawDescData\n}\n\nvar file_order_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_order_proto_goTypes = []interface{}{\n\t(*Address)(nil),        // 0: order.Address\n\t(*PlaceOrderReq)(nil),  // 1: order.PlaceOrderReq\n\t(*OrderItem)(nil),      // 2: order.OrderItem\n\t(*OrderResult)(nil),    // 3: order.OrderResult\n\t(*PlaceOrderResp)(nil), // 4: order.PlaceOrderResp\n\t(*ListOrderReq)(nil),   // 5: order.ListOrderReq\n\t(*Order)(nil),          // 6: order.Order\n\t(*ListOrderResp)(nil),  // 7: order.ListOrderResp\n\t(*cart.CartItem)(nil),  // 8: cart.CartItem\n}\nvar file_order_proto_depIdxs = []int32{\n\t0, // 0: order.PlaceOrderReq.address:type_name -> order.Address\n\t2, // 1: order.PlaceOrderReq.order_items:type_name -> order.OrderItem\n\t8, // 2: order.OrderItem.item:type_name -> cart.CartItem\n\t3, // 3: order.PlaceOrderResp.order:type_name -> order.OrderResult\n\t2, // 4: order.Order.order_items:type_name -> order.OrderItem\n\t0, // 5: order.Order.address:type_name -> order.Address\n\t6, // 6: order.ListOrderResp.orders:type_name -> order.Order\n\t1, // 7: order.OrderService.PlaceOrder:input_type -> order.PlaceOrderReq\n\t5, // 8: order.OrderService.ListOrder:input_type -> order.ListOrderReq\n\t4, // 9: order.OrderService.PlaceOrder:output_type -> order.PlaceOrderResp\n\t7, // 10: order.OrderService.ListOrder:output_type -> order.ListOrderResp\n\t9, // [9:11] is the sub-list for method output_type\n\t7, // [7:9] is the sub-list for method input_type\n\t7, // [7:7] is the sub-list for extension type_name\n\t7, // [7:7] is the sub-list for extension extendee\n\t0, // [0:7] is the sub-list for field type_name\n}\n\nfunc init() { file_order_proto_init() }\nfunc file_order_proto_init() {\n\tif File_order_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_order_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderResult); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Order); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_proto_goTypes,\n\t\tDependencyIndexes: file_order_proto_depIdxs,\n\t\tMessageInfos:      file_order_proto_msgTypes,\n\t}.Build()\n\tFile_order_proto = out.File\n\tfile_order_proto_rawDesc = nil\n\tfile_order_proto_goTypes = nil\n\tfile_order_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype OrderService interface {\n\tPlaceOrder(ctx context.Context, req *PlaceOrderReq) (res *PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, req *ListOrderReq) (res *ListOrderResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/order/orderservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kOrderServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kOrderServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kOrderServiceClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.PlaceOrder(ctx, Req)\n}\n\nfunc (p *kOrderServiceClient) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListOrder(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/order/orderservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler order.OrderService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/order/orderservice/orderservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn orderServiceServiceInfo\n}\n\nvar orderServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"OrderService\"\n\thandlerType := (*order.OrderService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"PlaceOrder\": kitex.NewMethodInfo(placeOrderHandler, newPlaceOrderArgs, newPlaceOrderResult, false),\n\t\t\"ListOrder\":  kitex.NewMethodInfo(listOrderHandler, newListOrderArgs, newListOrderResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"order\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc placeOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.PlaceOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).PlaceOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *PlaceOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).PlaceOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*PlaceOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newPlaceOrderArgs() interface{} {\n\treturn &PlaceOrderArgs{}\n}\n\nfunc newPlaceOrderResult() interface{} {\n\treturn &PlaceOrderResult{}\n}\n\ntype PlaceOrderArgs struct {\n\tReq *order.PlaceOrderReq\n}\n\nfunc (p *PlaceOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.PlaceOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *PlaceOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *PlaceOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar PlaceOrderArgs_Req_DEFAULT *order.PlaceOrderReq\n\nfunc (p *PlaceOrderArgs) GetReq() *order.PlaceOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn PlaceOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *PlaceOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PlaceOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype PlaceOrderResult struct {\n\tSuccess *order.PlaceOrderResp\n}\n\nvar PlaceOrderResult_Success_DEFAULT *order.PlaceOrderResp\n\nfunc (p *PlaceOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.PlaceOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *PlaceOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *PlaceOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *PlaceOrderResult) GetSuccess() *order.PlaceOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn PlaceOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *PlaceOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.PlaceOrderResp)\n}\n\nfunc (p *PlaceOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PlaceOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc listOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.ListOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).ListOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).ListOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListOrderArgs() interface{} {\n\treturn &ListOrderArgs{}\n}\n\nfunc newListOrderResult() interface{} {\n\treturn &ListOrderResult{}\n}\n\ntype ListOrderArgs struct {\n\tReq *order.ListOrderReq\n}\n\nfunc (p *ListOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.ListOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListOrderArgs_Req_DEFAULT *order.ListOrderReq\n\nfunc (p *ListOrderArgs) GetReq() *order.ListOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn ListOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListOrderResult struct {\n\tSuccess *order.ListOrderResp\n}\n\nvar ListOrderResult_Success_DEFAULT *order.ListOrderResp\n\nfunc (p *ListOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.ListOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListOrderResult) GetSuccess() *order.ListOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.ListOrderResp)\n}\n\nfunc (p *ListOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq) (r *order.PlaceOrderResp, err error) {\n\tvar _args PlaceOrderArgs\n\t_args.Req = Req\n\tvar _result PlaceOrderResult\n\tif err = p.c.Call(ctx, \"PlaceOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) ListOrder(ctx context.Context, Req *order.ListOrderReq) (r *order.ListOrderResp, err error) {\n\tvar _args ListOrderArgs\n\t_args.Req = Req\n\tvar _result ListOrderResult\n\tif err = p.c.Call(ctx, \"ListOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/order/orderservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler order.OrderService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/payment/payment.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage payment\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CreditCardInfo) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CreditCardInfo[number], err)\n}\n\nfunc (x *CreditCardInfo) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardNumber, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardCvv, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationYear, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationMonth, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeReq[number], err)\n}\n\nfunc (x *ChargeReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Amount, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *ChargeReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeResp[number], err)\n}\n\nfunc (x *ChargeResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField1(buf []byte) (offset int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetCreditCardNumber())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetCreditCardCvv())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField3(buf []byte) (offset int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 3, x.GetCreditCardExpirationYear())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField4(buf []byte) (offset int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 4, x.GetCreditCardExpirationMonth())\n\treturn offset\n}\n\nfunc (x *ChargeReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Amount == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 1, x.GetAmount())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 4, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *ChargeResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField1() (n int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetCreditCardNumber())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField2() (n int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetCreditCardCvv())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField3() (n int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(3, x.GetCreditCardExpirationYear())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField4() (n int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(4, x.GetCreditCardExpirationMonth())\n\treturn n\n}\n\nfunc (x *ChargeReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField1() (n int) {\n\tif x.Amount == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(1, x.GetAmount())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField2() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField3() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField4() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(4, x.GetUserId())\n\treturn n\n}\n\nfunc (x *ChargeResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ChargeResp) sizeField1() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_CreditCardInfo = map[int32]string{\n\t1: \"CreditCardNumber\",\n\t2: \"CreditCardCvv\",\n\t3: \"CreditCardExpirationYear\",\n\t4: \"CreditCardExpirationMonth\",\n}\n\nvar fieldIDToName_ChargeReq = map[int32]string{\n\t1: \"Amount\",\n\t2: \"CreditCard\",\n\t3: \"OrderId\",\n\t4: \"UserId\",\n}\n\nvar fieldIDToName_ChargeResp = map[int32]string{\n\t1: \"TransactionId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/payment/payment.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: payment.proto\n\npackage payment\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CreditCardInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCreditCardNumber          string `protobuf:\"bytes,1,opt,name=credit_card_number,json=creditCardNumber,proto3\" json:\"credit_card_number,omitempty\"`\n\tCreditCardCvv             int32  `protobuf:\"varint,2,opt,name=credit_card_cvv,json=creditCardCvv,proto3\" json:\"credit_card_cvv,omitempty\"`\n\tCreditCardExpirationYear  int32  `protobuf:\"varint,3,opt,name=credit_card_expiration_year,json=creditCardExpirationYear,proto3\" json:\"credit_card_expiration_year,omitempty\"`\n\tCreditCardExpirationMonth int32  `protobuf:\"varint,4,opt,name=credit_card_expiration_month,json=creditCardExpirationMonth,proto3\" json:\"credit_card_expiration_month,omitempty\"`\n}\n\nfunc (x *CreditCardInfo) Reset() {\n\t*x = CreditCardInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreditCardInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreditCardInfo) ProtoMessage() {}\n\nfunc (x *CreditCardInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreditCardInfo.ProtoReflect.Descriptor instead.\nfunc (*CreditCardInfo) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreditCardInfo) GetCreditCardNumber() string {\n\tif x != nil {\n\t\treturn x.CreditCardNumber\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreditCardInfo) GetCreditCardCvv() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardCvv\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationMonth\n\t}\n\treturn 0\n}\n\ntype ChargeReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAmount     float32         `protobuf:\"fixed32,1,opt,name=amount,proto3\" json:\"amount,omitempty\"`\n\tCreditCard *CreditCardInfo `protobuf:\"bytes,2,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n\tOrderId    string          `protobuf:\"bytes,3,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId     uint32          `protobuf:\"varint,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ChargeReq) Reset() {\n\t*x = ChargeReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeReq) ProtoMessage() {}\n\nfunc (x *ChargeReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeReq.ProtoReflect.Descriptor instead.\nfunc (*ChargeReq) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ChargeReq) GetAmount() float32 {\n\tif x != nil {\n\t\treturn x.Amount\n\t}\n\treturn 0\n}\n\nfunc (x *ChargeReq) GetCreditCard() *CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\nfunc (x *ChargeReq) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *ChargeReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype ChargeResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTransactionId string `protobuf:\"bytes,1,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *ChargeResp) Reset() {\n\t*x = ChargeResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeResp) ProtoMessage() {}\n\nfunc (x *ChargeResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeResp.ProtoReflect.Descriptor instead.\nfunc (*ChargeResp) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ChargeResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_payment_proto protoreflect.FileDescriptor\n\nvar file_payment_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x12, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65,\n\t0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43,\n\t0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x76, 0x76, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x43, 0x76,\n\t0x76, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61, 0x72,\n\t0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f,\n\t0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x6e, 0x74,\n\t0x68, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12,\n\t0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52,\n\t0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69,\n\t0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,\n\t0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,\n\t0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75,\n\t0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61,\n\t0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x45, 0x0a, 0x0e, 0x50, 0x61,\n\t0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x06,\n\t0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x61, 0x79,\n\t0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_payment_proto_rawDescOnce sync.Once\n\tfile_payment_proto_rawDescData = file_payment_proto_rawDesc\n)\n\nfunc file_payment_proto_rawDescGZIP() []byte {\n\tfile_payment_proto_rawDescOnce.Do(func() {\n\t\tfile_payment_proto_rawDescData = protoimpl.X.CompressGZIP(file_payment_proto_rawDescData)\n\t})\n\treturn file_payment_proto_rawDescData\n}\n\nvar file_payment_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_payment_proto_goTypes = []interface{}{\n\t(*CreditCardInfo)(nil), // 0: payment.CreditCardInfo\n\t(*ChargeReq)(nil),      // 1: payment.ChargeReq\n\t(*ChargeResp)(nil),     // 2: payment.ChargeResp\n}\nvar file_payment_proto_depIdxs = []int32{\n\t0, // 0: payment.ChargeReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 1: payment.PaymentService.Charge:input_type -> payment.ChargeReq\n\t2, // 2: payment.PaymentService.Charge:output_type -> payment.ChargeResp\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_payment_proto_init() }\nfunc file_payment_proto_init() {\n\tif File_payment_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_payment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreditCardInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_payment_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_payment_proto_goTypes,\n\t\tDependencyIndexes: file_payment_proto_depIdxs,\n\t\tMessageInfos:      file_payment_proto_msgTypes,\n\t}.Build()\n\tFile_payment_proto = out.File\n\tfile_payment_proto_rawDesc = nil\n\tfile_payment_proto_goTypes = nil\n\tfile_payment_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype PaymentService interface {\n\tCharge(ctx context.Context, req *ChargeReq) (res *ChargeResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/payment/paymentservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kPaymentServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kPaymentServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kPaymentServiceClient) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Charge(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/payment/paymentservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler payment.PaymentService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/payment/paymentservice/paymentservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfo\n}\n\nvar paymentServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"PaymentService\"\n\thandlerType := (*payment.PaymentService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Charge\": kitex.NewMethodInfo(chargeHandler, newChargeArgs, newChargeResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"payment\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc chargeHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(payment.ChargeReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(payment.PaymentService).Charge(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ChargeArgs:\n\t\tsuccess, err := handler.(payment.PaymentService).Charge(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ChargeResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newChargeArgs() interface{} {\n\treturn &ChargeArgs{}\n}\n\nfunc newChargeResult() interface{} {\n\treturn &ChargeResult{}\n}\n\ntype ChargeArgs struct {\n\tReq *payment.ChargeReq\n}\n\nfunc (p *ChargeArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(payment.ChargeReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ChargeArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ChargeArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ChargeArgs) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ChargeArgs_Req_DEFAULT *payment.ChargeReq\n\nfunc (p *ChargeArgs) GetReq() *payment.ChargeReq {\n\tif !p.IsSetReq() {\n\t\treturn ChargeArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ChargeArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ChargeArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ChargeResult struct {\n\tSuccess *payment.ChargeResp\n}\n\nvar ChargeResult_Success_DEFAULT *payment.ChargeResp\n\nfunc (p *ChargeResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(payment.ChargeResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ChargeResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ChargeResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ChargeResult) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ChargeResult) GetSuccess() *payment.ChargeResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ChargeResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ChargeResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*payment.ChargeResp)\n}\n\nfunc (p *ChargeResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ChargeResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Charge(ctx context.Context, Req *payment.ChargeReq) (r *payment.ChargeResp, err error) {\n\tvar _args ChargeArgs\n\t_args.Req = Req\n\tvar _result ChargeResult\n\tif err = p.c.Call(ctx, \"Charge\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/payment/paymentservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler payment.PaymentService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/product/product.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *ListProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsReq[number], err)\n}\n\nfunc (x *ListProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Page, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.PageSize, offset, err = fastpb.ReadInt64(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CategoryName, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Product[number], err)\n}\n\nfunc (x *Product) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Name, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Description, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Picture, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Price, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v string\n\tv, offset, err = fastpb.ReadString(buf, _type)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Categories = append(x.Categories, v)\n\treturn offset, err\n}\n\nfunc (x *ListProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsResp[number], err)\n}\n\nfunc (x *ListProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Products = append(x.Products, &v)\n\treturn offset, nil\n}\n\nfunc (x *GetProductReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductReq[number], err)\n}\n\nfunc (x *GetProductReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetProductResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductResp[number], err)\n}\n\nfunc (x *GetProductResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Product = &v\n\treturn offset, nil\n}\n\nfunc (x *SearchProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsReq[number], err)\n}\n\nfunc (x *SearchProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Query, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *SearchProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsResp[number], err)\n}\n\nfunc (x *SearchProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Results = append(x.Results, &v)\n\treturn offset, nil\n}\n\nfunc (x *ListProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Page == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetPage())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.PageSize == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt64(buf[offset:], 2, x.GetPageSize())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.CategoryName == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetCategoryName())\n\treturn offset\n}\n\nfunc (x *Product) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField2(buf []byte) (offset int) {\n\tif x.Name == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetName())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField3(buf []byte) (offset int) {\n\tif x.Description == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetDescription())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField4(buf []byte) (offset int) {\n\tif x.Picture == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetPicture())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField5(buf []byte) (offset int) {\n\tif x.Price == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 5, x.GetPrice())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField6(buf []byte) (offset int) {\n\tif len(x.Categories) == 0 {\n\t\treturn offset\n\t}\n\tfor i := range x.GetCategories() {\n\t\toffset += fastpb.WriteString(buf[offset:], 6, x.GetCategories()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Products == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetProducts() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProducts()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *GetProductReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *GetProductResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Product == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProduct())\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Query == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetQuery())\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Results == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetResults() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetResults()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField1() (n int) {\n\tif x.Page == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetPage())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField2() (n int) {\n\tif x.PageSize == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt64(2, x.GetPageSize())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField3() (n int) {\n\tif x.CategoryName == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetCategoryName())\n\treturn n\n}\n\nfunc (x *Product) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Product) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *Product) sizeField2() (n int) {\n\tif x.Name == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetName())\n\treturn n\n}\n\nfunc (x *Product) sizeField3() (n int) {\n\tif x.Description == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetDescription())\n\treturn n\n}\n\nfunc (x *Product) sizeField4() (n int) {\n\tif x.Picture == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetPicture())\n\treturn n\n}\n\nfunc (x *Product) sizeField5() (n int) {\n\tif x.Price == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(5, x.GetPrice())\n\treturn n\n}\n\nfunc (x *Product) sizeField6() (n int) {\n\tif len(x.Categories) == 0 {\n\t\treturn n\n\t}\n\tfor i := range x.GetCategories() {\n\t\tn += fastpb.SizeString(6, x.GetCategories()[i])\n\t}\n\treturn n\n}\n\nfunc (x *ListProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListProductsResp) sizeField1() (n int) {\n\tif x.Products == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetProducts() {\n\t\tn += fastpb.SizeMessage(1, x.GetProducts()[i])\n\t}\n\treturn n\n}\n\nfunc (x *GetProductReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductReq) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *GetProductResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductResp) sizeField1() (n int) {\n\tif x.Product == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetProduct())\n\treturn n\n}\n\nfunc (x *SearchProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsReq) sizeField1() (n int) {\n\tif x.Query == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetQuery())\n\treturn n\n}\n\nfunc (x *SearchProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsResp) sizeField1() (n int) {\n\tif x.Results == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetResults() {\n\t\tn += fastpb.SizeMessage(1, x.GetResults()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_ListProductsReq = map[int32]string{\n\t1: \"Page\",\n\t2: \"PageSize\",\n\t3: \"CategoryName\",\n}\n\nvar fieldIDToName_Product = map[int32]string{\n\t1: \"Id\",\n\t2: \"Name\",\n\t3: \"Description\",\n\t4: \"Picture\",\n\t5: \"Price\",\n\t6: \"Categories\",\n}\n\nvar fieldIDToName_ListProductsResp = map[int32]string{\n\t1: \"Products\",\n}\n\nvar fieldIDToName_GetProductReq = map[int32]string{\n\t1: \"Id\",\n}\n\nvar fieldIDToName_GetProductResp = map[int32]string{\n\t1: \"Product\",\n}\n\nvar fieldIDToName_SearchProductsReq = map[int32]string{\n\t1: \"Query\",\n}\n\nvar fieldIDToName_SearchProductsResp = map[int32]string{\n\t1: \"Results\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/product/product.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: product.proto\n\npackage product\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPage         int32  `protobuf:\"varint,1,opt,name=page,proto3\" json:\"page,omitempty\"`\n\tPageSize     int64  `protobuf:\"varint,2,opt,name=pageSize,proto3\" json:\"pageSize,omitempty\"`\n\tCategoryName string `protobuf:\"bytes,3,opt,name=categoryName,proto3\" json:\"categoryName,omitempty\"`\n}\n\nfunc (x *ListProductsReq) Reset() {\n\t*x = ListProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsReq) ProtoMessage() {}\n\nfunc (x *ListProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsReq.ProtoReflect.Descriptor instead.\nfunc (*ListProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListProductsReq) GetPage() int32 {\n\tif x != nil {\n\t\treturn x.Page\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetPageSize() int64 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetCategoryName() string {\n\tif x != nil {\n\t\treturn x.CategoryName\n\t}\n\treturn \"\"\n}\n\ntype Product struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          uint32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string   `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tPicture     string   `protobuf:\"bytes,4,opt,name=picture,proto3\" json:\"picture,omitempty\"`\n\tPrice       float32  `protobuf:\"fixed32,5,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tCategories  []string `protobuf:\"bytes,6,rep,name=categories,proto3\" json:\"categories,omitempty\"`\n}\n\nfunc (x *Product) Reset() {\n\t*x = Product{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Product) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Product) ProtoMessage() {}\n\nfunc (x *Product) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Product.ProtoReflect.Descriptor instead.\nfunc (*Product) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Product) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPicture() string {\n\tif x != nil {\n\t\treturn x.Picture\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPrice() float32 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetCategories() []string {\n\tif x != nil {\n\t\treturn x.Categories\n\t}\n\treturn nil\n}\n\ntype ListProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProducts []*Product `protobuf:\"bytes,1,rep,name=products,proto3\" json:\"products,omitempty\"`\n}\n\nfunc (x *ListProductsResp) Reset() {\n\t*x = ListProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsResp) ProtoMessage() {}\n\nfunc (x *ListProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsResp.ProtoReflect.Descriptor instead.\nfunc (*ListProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListProductsResp) GetProducts() []*Product {\n\tif x != nil {\n\t\treturn x.Products\n\t}\n\treturn nil\n}\n\ntype GetProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetProductReq) Reset() {\n\t*x = GetProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductReq) ProtoMessage() {}\n\nfunc (x *GetProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductReq.ProtoReflect.Descriptor instead.\nfunc (*GetProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetProductResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProduct *Product `protobuf:\"bytes,1,opt,name=product,proto3\" json:\"product,omitempty\"`\n}\n\nfunc (x *GetProductResp) Reset() {\n\t*x = GetProductResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductResp) ProtoMessage() {}\n\nfunc (x *GetProductResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductResp.ProtoReflect.Descriptor instead.\nfunc (*GetProductResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetProductResp) GetProduct() *Product {\n\tif x != nil {\n\t\treturn x.Product\n\t}\n\treturn nil\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *SearchProductsReq) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\ntype SearchProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*Product `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *SearchProductsResp) Reset() {\n\t*x = SearchProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsResp) ProtoMessage() {}\n\nfunc (x *SearchProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsResp.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SearchProductsResp) GetResults() []*Product {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_product_proto protoreflect.FileDescriptor\n\nvar file_product_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x65, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12,\n\t0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63,\n\t0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22,\n\t0x9f, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70,\n\t0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63,\n\t0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18,\n\t0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65,\n\t0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,\n\t0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x40, 0x0a,\n\t0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x32,\n\t0xec, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x61, 0x74, 0x61, 0x6c,\n\t0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x4c, 0x69, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x12, 0x3f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x16,\n\t0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x12, 0x4b, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65,\n\t0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x1a,\n\t0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x40,\n\t0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b,\n\t0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_proto_rawDescOnce sync.Once\n\tfile_product_proto_rawDescData = file_product_proto_rawDesc\n)\n\nfunc file_product_proto_rawDescGZIP() []byte {\n\tfile_product_proto_rawDescOnce.Do(func() {\n\t\tfile_product_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_proto_rawDescData)\n\t})\n\treturn file_product_proto_rawDescData\n}\n\nvar file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_product_proto_goTypes = []interface{}{\n\t(*ListProductsReq)(nil),    // 0: product.ListProductsReq\n\t(*Product)(nil),            // 1: product.Product\n\t(*ListProductsResp)(nil),   // 2: product.ListProductsResp\n\t(*GetProductReq)(nil),      // 3: product.GetProductReq\n\t(*GetProductResp)(nil),     // 4: product.GetProductResp\n\t(*SearchProductsReq)(nil),  // 5: product.SearchProductsReq\n\t(*SearchProductsResp)(nil), // 6: product.SearchProductsResp\n}\nvar file_product_proto_depIdxs = []int32{\n\t1, // 0: product.ListProductsResp.products:type_name -> product.Product\n\t1, // 1: product.GetProductResp.product:type_name -> product.Product\n\t1, // 2: product.SearchProductsResp.results:type_name -> product.Product\n\t0, // 3: product.ProductCatalogService.ListProducts:input_type -> product.ListProductsReq\n\t3, // 4: product.ProductCatalogService.GetProduct:input_type -> product.GetProductReq\n\t5, // 5: product.ProductCatalogService.SearchProducts:input_type -> product.SearchProductsReq\n\t2, // 6: product.ProductCatalogService.ListProducts:output_type -> product.ListProductsResp\n\t4, // 7: product.ProductCatalogService.GetProduct:output_type -> product.GetProductResp\n\t6, // 8: product.ProductCatalogService.SearchProducts:output_type -> product.SearchProductsResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_product_proto_init() }\nfunc file_product_proto_init() {\n\tif File_product_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Product); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_proto_goTypes,\n\t\tDependencyIndexes: file_product_proto_depIdxs,\n\t\tMessageInfos:      file_product_proto_msgTypes,\n\t}.Build()\n\tFile_product_proto = out.File\n\tfile_product_proto_rawDesc = nil\n\tfile_product_proto_goTypes = nil\n\tfile_product_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype ProductCatalogService interface {\n\tListProducts(ctx context.Context, req *ListProductsReq) (res *ListProductsResp, err error)\n\tGetProduct(ctx context.Context, req *GetProductReq) (res *GetProductResp, err error)\n\tSearchProducts(ctx context.Context, req *SearchProductsReq) (res *SearchProductsResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/product/productcatalogservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductCatalogServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductCatalogServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductCatalogServiceClient) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.SearchProducts(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/product/productcatalogservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductCatalogService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/product/productcatalogservice/productcatalogservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfo\n}\n\nvar productCatalogServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"ProductCatalogService\"\n\thandlerType := (*product.ProductCatalogService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"ListProducts\":   kitex.NewMethodInfo(listProductsHandler, newListProductsArgs, newListProductsResult, false),\n\t\t\"GetProduct\":     kitex.NewMethodInfo(getProductHandler, newGetProductArgs, newGetProductResult, false),\n\t\t\"SearchProducts\": kitex.NewMethodInfo(searchProductsHandler, newSearchProductsArgs, newSearchProductsResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"product\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.ListProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).ListProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).ListProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListProductsArgs() interface{} {\n\treturn &ListProductsArgs{}\n}\n\nfunc newListProductsResult() interface{} {\n\treturn &ListProductsResult{}\n}\n\ntype ListProductsArgs struct {\n\tReq *product.ListProductsReq\n}\n\nfunc (p *ListProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.ListProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListProductsArgs_Req_DEFAULT *product.ListProductsReq\n\nfunc (p *ListProductsArgs) GetReq() *product.ListProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn ListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListProductsResult struct {\n\tSuccess *product.ListProductsResp\n}\n\nvar ListProductsResult_Success_DEFAULT *product.ListProductsResp\n\nfunc (p *ListProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.ListProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListProductsResult) GetSuccess() *product.ListProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.ListProductsResp)\n}\n\nfunc (p *ListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.GetProductReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).GetProduct(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetProductArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).GetProduct(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetProductResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetProductArgs() interface{} {\n\treturn &GetProductArgs{}\n}\n\nfunc newGetProductResult() interface{} {\n\treturn &GetProductResult{}\n}\n\ntype GetProductArgs struct {\n\tReq *product.GetProductReq\n}\n\nfunc (p *GetProductArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.GetProductReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetProductArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetProductArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetProductArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetProductArgs_Req_DEFAULT *product.GetProductReq\n\nfunc (p *GetProductArgs) GetReq() *product.GetProductReq {\n\tif !p.IsSetReq() {\n\t\treturn GetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetProductResult struct {\n\tSuccess *product.GetProductResp\n}\n\nvar GetProductResult_Success_DEFAULT *product.GetProductResp\n\nfunc (p *GetProductResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.GetProductResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetProductResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetProductResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetProductResult) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetProductResult) GetSuccess() *product.GetProductResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.GetProductResp)\n}\n\nfunc (p *GetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc searchProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.SearchProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).SearchProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SearchProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).SearchProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SearchProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSearchProductsArgs() interface{} {\n\treturn &SearchProductsArgs{}\n}\n\nfunc newSearchProductsResult() interface{} {\n\treturn &SearchProductsResult{}\n}\n\ntype SearchProductsArgs struct {\n\tReq *product.SearchProductsReq\n}\n\nfunc (p *SearchProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.SearchProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SearchProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SearchProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SearchProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SearchProductsArgs_Req_DEFAULT *product.SearchProductsReq\n\nfunc (p *SearchProductsArgs) GetReq() *product.SearchProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn SearchProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SearchProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SearchProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SearchProductsResult struct {\n\tSuccess *product.SearchProductsResp\n}\n\nvar SearchProductsResult_Success_DEFAULT *product.SearchProductsResp\n\nfunc (p *SearchProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.SearchProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SearchProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SearchProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SearchProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SearchProductsResult) GetSuccess() *product.SearchProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SearchProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SearchProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.SearchProductsResp)\n}\n\nfunc (p *SearchProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SearchProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, Req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args ListProductsArgs\n\t_args.Req = Req\n\tvar _result ListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, Req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args GetProductArgs\n\t_args.Req = Req\n\tvar _result GetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq) (r *product.SearchProductsResp, err error) {\n\tvar _args SearchProductsArgs\n\t_args.Req = Req\n\tvar _result SearchProductsResult\n\tif err = p.c.Call(ctx, \"SearchProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/product/productcatalogservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductCatalogService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ConfirmPassword, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetConfirmPassword())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetConfirmPassword())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"ConfirmPassword\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Register\": kitex.NewMethodInfo(registerHandler, newRegisterArgs, newRegisterResult, false),\n\t\t\"Login\":    kitex.NewMethodInfo(loginHandler, newLoginArgs, newLoginResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"user\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/cart/cart_client.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() cartservice.Client\n\tService() string\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := cartservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient cartservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() cartservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\treturn c.kitexClient.AddItem(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\treturn c.kitexClient.GetCart(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\treturn c.kitexClient.EmptyCart(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/cart/cart_default.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc AddItem(ctx context.Context, req *cart.AddItemReq, callOptions ...callopt.Option) (resp *cart.AddItemResp, err error) {\n\tresp, err = defaultClient.AddItem(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"AddItem call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetCart(ctx context.Context, req *cart.GetCartReq, callOptions ...callopt.Option) (resp *cart.GetCartResp, err error) {\n\tresp, err = defaultClient.GetCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc EmptyCart(ctx context.Context, req *cart.EmptyCartReq, callOptions ...callopt.Option) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = defaultClient.EmptyCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"EmptyCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/cart/cart_init.go",
    "content": "package cart\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"cart\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/checkout/checkout_client.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() checkoutservice.Client\n\tService() string\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := checkoutservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient checkoutservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() checkoutservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\treturn c.kitexClient.Checkout(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/checkout/checkout_default.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Checkout(ctx context.Context, req *checkout.CheckoutReq, callOptions ...callopt.Option) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = defaultClient.Checkout(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Checkout call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/checkout/checkout_init.go",
    "content": "package checkout\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"checkout\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/email/email_client.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() emailservice.Client\n\tService() string\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := emailservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient emailservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() emailservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\treturn c.kitexClient.Send(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/email/email_default.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Send(ctx context.Context, req *email.EmailReq, callOptions ...callopt.Option) (resp *email.EmailResp, err error) {\n\tresp, err = defaultClient.Send(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Send call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/email/email_init.go",
    "content": "package email\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"email\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/order/order_client.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() orderservice.Client\n\tService() string\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := orderservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient orderservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() orderservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\treturn c.kitexClient.PlaceOrder(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\treturn c.kitexClient.ListOrder(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/order/order_default.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc PlaceOrder(ctx context.Context, req *order.PlaceOrderReq, callOptions ...callopt.Option) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = defaultClient.PlaceOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"PlaceOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc ListOrder(ctx context.Context, req *order.ListOrderReq, callOptions ...callopt.Option) (resp *order.ListOrderResp, err error) {\n\tresp, err = defaultClient.ListOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/order/order_init.go",
    "content": "package order\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"order\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/payment/payment_client.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() paymentservice.Client\n\tService() string\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := paymentservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient paymentservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() paymentservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\treturn c.kitexClient.Charge(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/payment/payment_default.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Charge(ctx context.Context, req *payment.ChargeReq, callOptions ...callopt.Option) (resp *payment.ChargeResp, err error) {\n\tresp, err = defaultClient.Charge(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Charge call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/payment/payment_init.go",
    "content": "package payment\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"payment\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/product/product_client.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() productcatalogservice.Client\n\tService() string\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := productcatalogservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient productcatalogservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() productcatalogservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\treturn c.kitexClient.ListProducts(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\treturn c.kitexClient.GetProduct(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\treturn c.kitexClient.SearchProducts(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/product/product_default.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (resp *product.ListProductsResp, err error) {\n\tresp, err = defaultClient.ListProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (resp *product.GetProductResp, err error) {\n\tresp, err = defaultClient.GetProduct(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetProduct call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc SearchProducts(ctx context.Context, req *product.SearchProductsReq, callOptions ...callopt.Option) (resp *product.SearchProductsResp, err error) {\n\tresp, err = defaultClient.SearchProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"SearchProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/product/product_init.go",
    "content": "package product\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"product\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch16/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/Makefile",
    "content": "export ROOT_MOD=github.com/cloudwego/biz-demo/gomall\n.PHONY: all\nall: help\n\ndefault: help\n\n.PHONY: help\nhelp: ## Display this help.\n\t@awk 'BEGIN {FS = \":.*##\"; printf \"\\nUsage:\\n  make \\033[36m<target>\\033[0m\\n\"} /^[a-zA-Z_0-9-]+:.*?##/ { printf \"  \\033[36m%-15s\\033[0m %s\\n\", $$1, $$2 } /^##@/ { printf \"\\n\\033[1m%s\\033[0m\\n\", substr($$0, 5) } ' $(MAKEFILE_LIST)\n\n.PHONY: gen-demo-proto\ngen-demo-proto: ## gen demo proto project\n\t@cd demo/demo_proto && cwgo server -I ../../idl --module github.com/cloudwego/biz-demo/gomall/demo/demo_proto --service demo_proto --idl ../../idl/echo.proto\n\n.PHONY: gen-demo-thrift\ngen-demo-thrift: ## gen demo thrift project\n\t@cd demo/demo_thrift && cwgo server --module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift --service demo_thrift --idl ../../idl/echo.thrift\n\n.PHONY: demo-link-fix\ndemo-link-fix: ## demo proto project lint fix\n\tcd demo/demo_proto && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m\n\n.PHONY: gen-frontend\ngen-frontend: ## gen frontend\n\t@cd app/frontend && cwgo server -I ../../idl --type HTTP --service frontend --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl ../../idl/frontend/order_page.proto\n\n.PHONY: gen-user\ngen-user: ## gen user service\n\t@cd rpc_gen && cwgo client --type RPC --service user --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/user.proto\n\t@cd app/user && cwgo server --type RPC --service user --module ${ROOT_MOD}/app/user --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/user.proto\n\n.PHONY: gen-product\ngen-product: ## gen product service\n\t@cd rpc_gen && cwgo client --type RPC --service product --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/product.proto\n\t@cd app/product && cwgo server --type RPC --service product --module ${ROOT_MOD}/app/product --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/product.proto\n\n\n.PHONY: gen-cart\ngen-cart: ## gen cart service\n\t@cd rpc_gen && cwgo client --type RPC --service cart --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/cart.proto\n\t@cd app/cart && cwgo server --type RPC --service cart --module ${ROOT_MOD}/app/cart --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/cart.proto\n\n\n.PHONY: gen-checkout\ngen-checkout: ## gen checkout service\n\t@cd rpc_gen && cwgo client --type RPC --service checkout --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/checkout.proto\n\t@cd app/checkout && cwgo server --type RPC --service checkout --module ${ROOT_MOD}/app/checkout --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/checkout.proto\n\n\n.PHONY: gen-payment\ngen-payment: ## gen payment service\n\t@cd rpc_gen && cwgo client --type RPC --service payment --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/payment.proto\n\t@cd app/payment && cwgo server --type RPC --service payment --module ${ROOT_MOD}/app/payment --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/payment.proto\n\n.PHONY: gen-order\ngen-order: ## gen order service\n\t@cd rpc_gen && cwgo client --type RPC --service order --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/order.proto\n\t@cd app/order && cwgo server --type RPC --service order --module ${ROOT_MOD}/app/order --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/order.proto\n\n.PHONY: gen-email\ngen-email: ## gen email service\n\t@cd rpc_gen && cwgo client --type RPC --service email --module ${ROOT_MOD}/rpc_gen  -I ../idl  --idl ../idl/email.proto\n\t@cd app/email && cwgo server --type RPC --service email --module ${ROOT_MOD}/app/email --pass \"-use ${ROOT_MOD}/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/email.proto\n\n\n\n##@ Initialize Project\n.PHONY: init\ninit: ## Just copy `.env.example` to `.env` with one click, executed once.\n\t@scripts/copy_env.sh\n\n##@ Build\n\n.PHONY: gen\ngen: ## gen client code of {svc}. example: make gen svc=product\n\t@scripts/gen.sh ${svc}\n\n.PHONY: gen-client\ngen-client: ## gen client code of {svc}. example: make gen svc=product\n\t@cd rpc_gen && cwgo client --type RPC --service ${svc} --module github.com/cloudwego/biz-demo/gomall/rpc_gen  -I ../idl  --idl ../idl/${svc}.proto\n\n.PHONY: gen-server\ngen-server: ## gen service code of {svc}. example: make gen-server svc=product\n\t@cd app/${svc} && cwgo server --type RPC --service ${svc} --module github.com/cloudwego/biz-demo/gomall/app/${svc} --pass \"-use github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen\"  -I ../../idl  --idl ../../idl/${svc}.proto\n\n.PHONY: gen-checkout-client\ngen-checkout-client:\n\t@cd app/frontend && cwgo client -I ../../idl --type RPC --service checkout --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl ../../idl/checkout.proto\n\n.PHONY: gen-order-client\ngen-order-client:\n\t@cd app/frontend && cwgo client -I ../../idl --type RPC --service order --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl ../../idl/order.proto\n\n\n.PHONY: watch-frontend\nwatch-frontend:\n\t@cd app/frontend && air\n\n.PHONY: tidy\ntidy: ## run `go mod tidy` for all go module\n\t@scripts/tidy.sh\n\n.PHONY: lint\nlint: ## run `gofmt` for all go module\n\t@gofmt -l -w app\n\t@gofumpt -l -w  app\n\n.PHONY: vet\nvet: ## run `go vet` for all go module\n\t@scripts/vet.sh\n\n.PHONY: lint-fix\nlint-fix: ## run `golangci-lint` for all go module\n\t@scripts/fix.sh\n\n.PHONY: run\nrun: ## run {svc} server. example: make run svc=product\n\t@scripts/run.sh ${svc}\n\n##@ Development Env\n\n.PHONY: env-start\nenv-start:  ## launch all middleware software as the docker\n\t@docker-compose up -d\n\n.PHONY: env-stop\nenv-stop: ## stop all docker\n\t@docker-compose down\n\n.PHONY: cleanup\ncleanup: ## clern up all the tmp files\n\t@rm -r app/**/log/ app/**/tmp/\n\n##@ Open Browser\n\n.PHONY: open.gomall\nopen-gomall: ## open `gomall` website in the default browser\n\t@open \"http://localhost:8080/\"\n\n.PHONY: open.consul\nopen-consul: ## open `consul ui` in the default browser\n\t@open \"http://localhost:8500/ui/\"\n\n.PHONY: open.jaeger\nopen-jaeger: ## open `jaeger ui` in the default browser\n\t@open \"http://localhost:16686/search\"\n\n.PHONY: open.prometheus\nopen-prometheus: ## open `prometheus ui` in the default browser\n\t@open \"http://localhost:9090\"\n\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\t//nolint:errcheck\n\t\tDB.AutoMigrate(\n\t\t\t&model.Cart{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/model/cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Cart struct {\n\tBase\n\tUserId    uint32 `json:\"user_id\"`\n\tProductId uint32 `json:\"product_id\"`\n\tQty       uint32 `json:\"qty\"`\n}\n\nfunc (c Cart) TableName() string {\n\treturn \"cart\"\n}\n\nfunc GetCartByUserId(db *gorm.DB, ctx context.Context, userId uint32) (cartList []*Cart, err error) {\n\terr = db.Debug().WithContext(ctx).Model(&Cart{}).Find(&cartList, \"user_id = ?\", userId).Error\n\treturn cartList, err\n}\n\nfunc AddCart(db *gorm.DB, ctx context.Context, c *Cart) error {\n\tvar find Cart\n\terr := db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).First(&find).Error\n\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\treturn err\n\t}\n\tif find.ID != 0 {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Where(&Cart{UserId: c.UserId, ProductId: c.ProductId}).UpdateColumn(\"qty\", gorm.Expr(\"qty+?\", c.Qty)).Error\n\t} else {\n\t\terr = db.WithContext(ctx).Model(&Cart{}).Create(c).Error\n\t}\n\treturn err\n}\n\nfunc EmptyCart(db *gorm.DB, ctx context.Context, userId uint32) error {\n\tif userId == 0 {\n\t\treturn errors.New(\"user_is is required\")\n\t}\n\treturn db.WithContext(ctx).Delete(&Cart{}, \"user_id = ?\", userId).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/model/cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/service/add_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype AddItemService struct {\n\tctx context.Context\n} // NewAddItemService new AddItemService\nfunc NewAddItemService(ctx context.Context) *AddItemService {\n\treturn &AddItemService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *AddItemService) Run(req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\t// Finish your business logic.\n\tgetProduct, err := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: req.Item.GetProductId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif getProduct.Product == nil || getProduct.Product.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40004, \"product not exist\")\n\t}\n\n\terr = model.AddCart(mysql.DB, s.ctx, &model.Cart{\n\t\tUserId:    req.UserId,\n\t\tProductId: req.Item.ProductId,\n\t\tQty:       uint32(req.Item.Quantity),\n\t})\n\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\n\treturn &cart.AddItemResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/service/add_item_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestAddItem_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/service/empty_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype EmptyCartService struct {\n\tctx context.Context\n} // NewEmptyCartService new EmptyCartService\nfunc NewEmptyCartService(ctx context.Context) *EmptyCartService {\n\treturn &EmptyCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EmptyCartService) Run(req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\t// Finish your business logic.\n\terr = model.EmptyCart(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn &cart.EmptyCartResp{}, kerrors.NewBizStatusError(50001, \"empty cart error\")\n\t}\n\n\treturn &cart.EmptyCartResp{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/service/empty_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestEmptyCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/model\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetCartService struct {\n\tctx context.Context\n} // NewGetCartService new GetCartService\nfunc NewGetCartService(ctx context.Context) *GetCartService {\n\treturn &GetCartService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetCartService) Run(req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\t// resp = &cart.Cart{}\n\t// Finish your business logic.\n\tcarts, err := model.GetCartByUserId(mysql.DB, s.ctx, req.GetUserId())\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(50000, err.Error())\n\t}\n\tvar items []*cart.CartItem\n\tfor _, v := range carts {\n\t\titems = append(items, &cart.CartItem{ProductId: v.ProductId, Quantity: int32(v.Qty)})\n\t}\n\n\treturn &cart.GetCartResp{Cart: &cart.Cart{UserId: req.GetUserId(), Items: items}}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/biz/service/get_cart_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetCart_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"cart\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"cart\"\n  address: \":8883\"\n  metrics_port: \":9993\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/cart\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/service\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n)\n\n// CartServiceImpl implements the last service interface defined in the IDL.\ntype CartServiceImpl struct{}\n\n// AddItem implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) AddItem(ctx context.Context, req *cart.AddItemReq) (resp *cart.AddItemResp, err error) {\n\tresp, err = service.NewAddItemService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) GetCart(ctx context.Context, req *cart.GetCartReq) (resp *cart.GetCartResp, err error) {\n\tresp, err = service.NewGetCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// EmptyCart implements the CartServiceImpl interface.\nfunc (s *CartServiceImpl) EmptyCart(ctx context.Context, req *cart.EmptyCartReq) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = service.NewEmptyCartService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\tcartutils \"github.com/cloudwego/biz-demo/gomall/app/cart/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tProductClient productcatalogservice.Client\n\tonce          sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitProductClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcartutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: conf.GetConf().Kitex.Service,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t)\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcartutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'cart'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/cart/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\trpc.InitClient()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := cartservice.NewServer(new(CartServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/cart\"\nexec \"$CURDIR/bin/cart\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/script/cart.sql",
    "content": "create table cart\n(\n    id         int auto_increment,\n    user_id    int      not null,\n    product_id int      not null,\n    qty        int      not null,\n    created_at datetime not null default current_timestamp,\n    updated_at datetime not null default current_timestamp on update current_timestamp,\n    constraint cart_pk primary key (id)\n);"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/cart/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\ntype CheckoutService struct {\n\tctx context.Context\n} // NewCheckoutService new CheckoutService\nfunc NewCheckoutService(ctx context.Context) *CheckoutService {\n\treturn &CheckoutService{ctx: ctx}\n}\n\n/*\n\tRun\n\n1. get cart\n2. calculate cart\n3. create order\n4. empty cart\n5. pay\n6. change order result\n7. finish\n*/\nfunc (s *CheckoutService) Run(req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\t// Finish your business logic.\n\t// Idempotent\n\t// get cart\n\tcartResult, err := rpc.CartClient.GetCart(s.ctx, &cart.GetCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\tklog.Error(err)\n\t\terr = fmt.Errorf(\"GetCart.err:%v\", err)\n\t\treturn\n\t}\n\tif cartResult == nil || cartResult.Cart == nil || len(cartResult.Cart.Items) == 0 {\n\t\terr = errors.New(\"cart is empty\")\n\t\treturn\n\t}\n\tvar (\n\t\toi    []*order.OrderItem\n\t\ttotal float32\n\t)\n\tfor _, cartItem := range cartResult.Cart.Items {\n\t\tproductResp, resultErr := rpc.ProductClient.GetProduct(s.ctx, &product.GetProductReq{Id: cartItem.ProductId})\n\t\tif resultErr != nil {\n\t\t\tklog.Error(resultErr)\n\t\t\terr = resultErr\n\t\t\treturn\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\tcost := p.Price * float32(cartItem.Quantity)\n\t\ttotal += cost\n\t\toi = append(oi, &order.OrderItem{\n\t\t\tItem: &cart.CartItem{ProductId: cartItem.ProductId, Quantity: cartItem.Quantity},\n\t\t\tCost: cost,\n\t\t})\n\t}\n\t// create order\n\torderReq := &order.PlaceOrderReq{\n\t\tUserId:       req.UserId,\n\t\tUserCurrency: \"USD\",\n\t\tOrderItems:   oi,\n\t\tEmail:        req.Email,\n\t}\n\tif req.Address != nil {\n\t\taddr := req.Address\n\t\tzipCodeInt, _ := strconv.Atoi(addr.ZipCode)\n\t\torderReq.Address = &order.Address{\n\t\t\tStreetAddress: addr.StreetAddress,\n\t\t\tCity:          addr.City,\n\t\t\tCountry:       addr.Country,\n\t\t\tState:         addr.State,\n\t\t\tZipCode:       int32(zipCodeInt),\n\t\t}\n\t}\n\torderResult, err := rpc.OrderClient.PlaceOrder(s.ctx, orderReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"PlaceOrder.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(\"orderResult\", orderResult)\n\t// empty cart\n\temptyResult, err := rpc.CartClient.EmptyCart(s.ctx, &cart.EmptyCartReq{UserId: req.UserId})\n\tif err != nil {\n\t\terr = fmt.Errorf(\"EmptyCart.err:%v\", err)\n\t\treturn\n\t}\n\tklog.Info(emptyResult)\n\t// charge\n\tvar orderId string\n\tif orderResult != nil || orderResult.Order != nil {\n\t\torderId = orderResult.Order.OrderId\n\t}\n\tpayReq := &payment.ChargeReq{\n\t\tUserId:  req.UserId,\n\t\tOrderId: orderId,\n\t\tAmount:  total,\n\t\tCreditCard: &payment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CreditCard.CreditCardNumber,\n\t\t\tCreditCardExpirationYear:  req.CreditCard.CreditCardExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.CreditCard.CreditCardExpirationMonth,\n\t\t\tCreditCardCvv:             req.CreditCard.CreditCardCvv,\n\t\t},\n\t}\n\tpaymentResult, err := rpc.PaymentClient.Charge(s.ctx, payReq)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"Charge.err:%v\", err)\n\t\treturn\n\t}\n\tdata, _ := proto.Marshal(&email.EmailReq{\n\t\tFrom:        \"from@example.com\",\n\t\tTo:          req.Email,\n\t\tContentType: \"text/plain\",\n\t\tSubject:     \"You just created an order in CloudWeGo shop\",\n\t\tContent:     \"You just created an order in CloudWeGo shop\",\n\t})\n\tmsg := &nats.Msg{Subject: \"email\", Data: data}\n\t_ = mq.Nc.PublishMsg(msg)\n\n\tklog.Info(paymentResult)\n\t// change order state\n\tklog.Info(orderResult)\n\n\tresp = &checkout.CheckoutResp{\n\t\tOrderId:       orderId,\n\t\tTransactionId: paymentResult.TransactionId,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/biz/service/checkout_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCheckout_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"checkout\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"checkout\"\n  address: \":8884\"\n  metrics_port: \":9994\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/checkout\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.31.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/compress v1.17.4 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.7 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=\ngithub.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E=\ngithub.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8=\ngithub.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=\ngithub.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/biz/service\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n)\n\n// CheckoutServiceImpl implements the last service interface defined in the IDL.\ntype CheckoutServiceImpl struct{}\n\n// PlaceOrder implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) PlaceOrder(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Checkout implements the CheckoutServiceImpl interface.\nfunc (s *CheckoutServiceImpl) Checkout(ctx context.Context, req *checkout.CheckoutReq) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = service.NewCheckoutService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(nats.DefaultURL)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\tcheckoututils \"github.com/cloudwego/biz-demo/gomall/app/checkout/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tCartClient    cartservice.Client\n\tProductClient productcatalogservice.Client\n\tPaymentClient paymentservice.Client\n\tOrderClient   orderservice.Client\n\n\tonce        sync.Once\n\tserviceName = conf.GetConf().Kitex.Service\n)\n\nvar commonOpts []client.Option\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitCartClient()\n\t\tinitProductClient()\n\t\tinitPaymentClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\t\tCurrentServiceName: serviceName,\n\t\t\tTracerProvider:     mtl.TracerProvider,\n\t\t}),\n\t)\n\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: serviceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t)\n\topts = append(opts, commonOpts...)\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initPaymentClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: serviceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts, client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}), client.WithTransportProtocol(transport.GRPC), client.WithMetaHandler(transmeta.ClientHTTP2Handler))\n\topts = append(opts, commonOpts...)\n\tPaymentClient, err = paymentservice.NewClient(\"payment\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tcheckoututils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: serviceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\topts = append(opts, client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}), client.WithTransportProtocol(transport.GRPC), client.WithMetaHandler(transmeta.ClientHTTP2Handler))\n\topts = append(opts, commonOpts...)\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tcheckoututils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'checkout'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/checkout/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\trpc.InitClient()\n\tmq.Init()\n\n\topts := kitexInit()\n\n\tsvr := checkoutservice.NewServer(new(CheckoutServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tklog.SetLevel(conf.LogLevel())\n\tklog.SetOutput(os.Stdout)\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/checkout\"\nexec \"$CURDIR/bin/checkout\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/checkout/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/biz/consumer/consumer.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage consumer\n\nimport \"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer/email\"\n\nfunc Init() {\n\temail.ConsumerInit()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/biz/consumer/email/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/notify\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc ConsumerInit() {\n\t// Connect to a server\n\n\tsub, err := mq.Nc.Subscribe(\"email\", func(m *nats.Msg) {\n\t\tvar req email.EmailReq\n\t\terr := proto.Unmarshal(m.Data, &req)\n\t\tif err != nil {\n\t\t\tklog.Error(err)\n\t\t}\n\t\tnoopEmail := notify.NewNoopEmail()\n\t\t_ = noopEmail.Send(&req)\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tserver.RegisterShutdownHook(func() {\n\t\tsub.Unsubscribe() //nolint:errcheck\n\t\tmq.Nc.Close()\n\t})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/biz/consumer/email/email_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage email\n\nimport (\n\t\"testing\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nfunc TestEmailConsumer(t *testing.T) {\n\t// Connect to a server\n\tnc, _ := nats.Connect(nats.DefaultURL)\n\tdefer nc.Close()\n\n\tdata, err := proto.Marshal(&email.EmailReq{\n\t\tFrom:        \"hello@example.com\",\n\t\tTo:          \"to@example.com\",\n\t\tContentType: \"text/plain\",\n\t\tSubject:     \"hello world\",\n\t\tContent:     \"hello world\",\n\t})\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\terr = nc.PublishMsg(&nats.Msg{Subject: \"email\", Data: data})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/biz/service/send.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\ntype SendService struct {\n\tctx context.Context\n} // NewSendService new SendService\nfunc NewSendService(ctx context.Context) *SendService {\n\treturn &SendService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SendService) Run(req *email.EmailReq) (resp *email.EmailResp, err error) {\n\t// Finish your business logic.\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/biz/service/send_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\nfunc TestSend_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewSendService(ctx)\n\t// init req and assert value\n\n\treq := &email.EmailReq{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"email\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"email\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/email\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/nats-io/nats.go v1.31.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/compress v1.17.4 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nats-io/nkeys v0.4.7 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/crypto v0.40.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=\ngithub.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E=\ngithub.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8=\ngithub.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=\ngithub.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/service\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n)\n\n// EmailServiceImpl implements the last service interface defined in the IDL.\ntype EmailServiceImpl struct{}\n\n// Send implements the EmailServiceImpl interface.\nfunc (s *EmailServiceImpl) Send(ctx context.Context, req *email.EmailReq) (resp *email.EmailResp, err error) {\n\tresp, err = service.NewSendService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/infra/mq/nats.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mq\n\nimport (\n\t\"github.com/nats-io/nats.go\"\n)\n\nvar (\n\tNc  *nats.Conn\n\terr error\n)\n\nfunc Init() {\n\tNc, err = nats.Connect(nats.DefaultURL)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/infra/notify/email.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage notify\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/kr/pretty\"\n)\n\ntype NoopEmail struct{}\n\nfunc (e *NoopEmail) Send(req *email.EmailReq) error {\n\tpretty.Printf(\"%v\\n\", req)\n\treturn nil\n}\n\nfunc NewNoopEmail() NoopEmail {\n\treturn NoopEmail{}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'email'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/biz/consumer\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/email/infra/mq\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/server\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tmq.Init()\n\tconsumer.Init()\n\tsvr := emailservice.NewServer(new(EmailServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/email/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/email\"\nexec \"$CURDIR/bin/email\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/.air.toml",
    "content": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\n  args_bin = []\n  bin = \"./tmp/main\"\n  cmd = \"go build -o ./tmp/main .\"\n  delay = 0\n  exclude_dir = [\"assets\", \"tmp\", \"vendor\", \"testdata\"]\n  exclude_file = []\n  exclude_regex = [\"_test.go\"]\n  exclude_unchanged = false\n  follow_symlink = false\n  full_bin = \"\"\n  include_dir = []\n  include_ext = [\"go\", \"tpl\", \"tmpl\", \"html\", \"gohtml\"]\n  include_file = []\n  kill_delay = \"4s\"\n  log = \"build-errors.log\"\n  rerun = false\n  rerun_delay = 5000\n  send_interrupt = true\n  stop_on_error = false\n\n[color]\n  app = \"\"\n  build = \"yellow\"\n  main = \"magenta\"\n  runner = \"green\"\n  watcher = \"cyan\"\n\n[log]\n  main_only = false\n  time = false\n\n[misc]\n  clean_on_exit = false\n\n[screen]\n  clear_on_rebuild = false\n  keep_scroll = true\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.6.5\nhandlerDir: \"\"\nmodelDir: hertz_gen\nrouterDir: \"\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/auth/auth_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Register .\n// @router /auth/register [POST]\nfunc Register(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.RegisterReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewRegisterService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\tc.Redirect(consts.StatusFound, []byte(\"/\"))\n}\n\n// Login .\n// @router /auth/login [POST]\nfunc Login(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req auth.LoginReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewLoginService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(resp))\n}\n\n// Logout .\n// @router /auth/logout [POST]\nfunc Logout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t_, err = service.NewLogoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tredirect := \"/\"\n\n\tc.Redirect(consts.StatusFound, []byte(redirect))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/auth/auth_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestRegister(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/register\", Register)\n\tpath := \"/auth/register\"                                  // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogin(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/login\", Login)\n\tpath := \"/auth/login\"                                     // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestLogout(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/auth/logout\", Logout)\n\tpath := \"/auth/logout\"                                    // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/cart/cart_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// AddCartItem .\n// @router /cart [POST]\nfunc AddCartItem(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req cart.AddCartReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\t_, err = service.NewAddCartItemService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.Redirect(consts.StatusFound, []byte(\"/cart\"))\n}\n\n// GetCart .\n// @router /cart [GET]\nfunc GetCart(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetCartService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"cart\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/cart/cart_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cart\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestAddCartItem(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/cart\", AddCartItem)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestGetCart(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/cart\", GetCart)\n\tpath := \"/cart\"                                           // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/category/category_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Category .\n// @router /category/:category [GET]\nfunc Category(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req category.CategoryReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewCategoryService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"category\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/category/category_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage category\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCategory(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/category/:category\", Category)\n\tpath := \"/category/:category\"                             // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/checkout/checkout_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Checkout .\n// @router /checkout [GET]\nfunc Checkout(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"checkout\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutWaiting .\n// @router /checkout/waiting [POST]\nfunc CheckoutWaiting(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req checkout.CheckoutReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutWaitingService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, resp))\n}\n\n// CheckoutResult .\n// @router /checkout/result [GET]\nfunc CheckoutResult(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"warning\": err}))\n\t\treturn\n\t}\n\n\tresp, err := service.NewCheckoutResultService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"waiting\", utils.WarpResponse(ctx, c, hertzUtils.H{\"error\": err}))\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"result\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/checkout/checkout_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage checkout\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestCheckout(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout\", Checkout)\n\tpath := \"/checkout\"                                       // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutWaiting(t *testing.T) {\n\th := server.Default()\n\th.POST(\"/checkout/waiting\", CheckoutWaiting)\n\tpath := \"/checkout/waiting\"                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"POST\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n\nfunc TestCheckoutResult(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/checkout/result\", CheckoutResult)\n\tpath := \"/checkout/result\"                                // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/home/home_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// Home .\n// @router / [GET]\nfunc Home(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\t// resp, err :=\n\tresp, err := service.NewHomeService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"home\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/home/home_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage home\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestHome(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/\", Home)\n\tpath := \"/\"                                               // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/order/order_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\thertzUtils \"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// OrderList .\n// @router /order [GET]\nfunc OrderList(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req common.Empty\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewOrderListService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tc.HTML(consts.StatusOK, \"order\", hertzUtils.H{\"error\": err})\n\t\treturn\n\t}\n\n\tc.HTML(consts.StatusOK, \"order\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/order/order_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage order\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestOrderList(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/order\", OrderList)\n\tpath := \"/order\"                                          // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/product/product_service.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/service\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/utils\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\n// GetProduct .\n// @router /product [GET]\nfunc GetProduct(ctx context.Context, c *app.RequestContext) {\n\tvar err error\n\tvar req product.ProductReq\n\terr = c.BindAndValidate(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\n\tresp, err := service.NewGetProductService(ctx, c).Run(&req)\n\tif err != nil {\n\t\tutils.SendErrResponse(ctx, c, consts.StatusOK, err)\n\t\treturn\n\t}\n\tc.HTML(consts.StatusOK, \"product\", utils.WarpResponse(ctx, c, resp))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/handler/product/product_service_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage product\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t//\"github.com/cloudwego/hertz/pkg/common/test/assert\"\n\t\"github.com/cloudwego/hertz/pkg/common/ut\"\n)\n\nfunc TestGetProduct(t *testing.T) {\n\th := server.Default()\n\th.GET(\"/product\", GetProduct)\n\tpath := \"/product\"                                        // todo: you can customize query\n\tbody := &ut.Body{Body: bytes.NewBufferString(\"\"), Len: 1} // todo: you can customize body\n\theader := ut.Header{}                                     // todo: you can customize header\n\tw := ut.PerformRequest(h.Engine, \"GET\", path, body, header)\n\tresp := w.Result()\n\tt.Log(string(resp.Body()))\n\n\t// todo edit your unit test.\n\t// assert.DeepEqual(t, 200, resp.StatusCode())\n\t// assert.DeepEqual(t, \"null\", string(resp.Body()))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/auth/auth_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage auth\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_auth := root.Group(\"/auth\", _authMw()...)\n\t\t_auth.POST(\"/login\", append(_loginMw(), auth.Login)...)\n\t\t_auth.POST(\"/logout\", append(_logoutMw(), auth.Logout)...)\n\t\t_auth.POST(\"/register\", append(_registerMw(), auth.Register)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/auth/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage auth\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _authMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _loginMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _logoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _registerMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/cart/cart_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.POST(\"/cart\", append(_addcartitemMw(), cart.AddCartItem)...)\n\troot.GET(\"/cart\", append(_getcartMw(), cart.GetCart)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/cart/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage cart\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn []app.HandlerFunc{middleware.Auth()}\n}\n\nfunc _addcartitemMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getcartMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/category/category_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage category\n\nimport (\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/category\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\t{\n\t\t_category := root.Group(\"/category\", _categoryMw()...)\n\t\t_category.GET(\"/:category\", append(_category0Mw(), category.Category)...)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/category/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage category\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _categoryMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _category0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/checkout/checkout_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/checkout\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/checkout\", append(_checkout0Mw(), checkout.Checkout)...)\n\t_checkout := root.Group(\"/checkout\", _checkoutMw()...)\n\t_checkout.GET(\"/result\", append(_checkoutresultMw(), checkout.CheckoutResult)...)\n\t_checkout.POST(\"/waiting\", append(_checkoutwaitingMw(), checkout.CheckoutWaiting)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/checkout/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage checkout\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkout0Mw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutresultMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _checkoutwaitingMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/home/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage home\n\nimport (\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/home\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/\", append(_homeMw(), home.Home)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/home/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage home\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _homeMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/order/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage order\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _orderlistMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/order/order_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage order\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/order\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/order\", append(_orderlistMw(), order.OrderList)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/product/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage product\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\nfunc rootMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n\nfunc _getproductMw() []app.HandlerFunc {\n\t// your code...\n\treturn nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/product/product_page.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage product\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/handler/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n/*\n This file will register all the routes of the services in the master idl.\n And it will update automatically when you use the \"update\" command for the idl.\n So don't modify the contents of the file, or your code will be deleted when it is updated.\n*/\n\n// Register register routes based on the IDL 'api.${HTTP Method}' annotation.\nfunc Register(r *server.Hertz) {\n\n\troot := r.Group(\"/\", rootMw()...)\n\troot.GET(\"/product\", append(_getproductMw(), product.GetProduct)...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/router/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator. DO NOT EDIT.\n\npackage router\n\nimport (\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/auth\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/cart\"\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/category\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/checkout\"\n\thome \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/home\"\n\torder \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/order\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router/product\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t//INSERT_POINT: DO NOT DELETE THIS LINE!\n\torder.Register(r)\n\n\tcheckout.Register(r)\n\n\tcart.Register(r)\n\n\tproduct.Register(r)\n\n\tcategory.Register(r)\n\n\tauth.Register(r)\n\n\thome.Register(r)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/add_cart_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/cart\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype AddCartItemService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewAddCartItemService(Context context.Context, RequestContext *app.RequestContext) *AddCartItemService {\n\treturn &AddCartItemService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *AddCartItemService) Run(req *cart.AddCartReq) (resp *common.Empty, err error) {\n\t_, err = rpc.CartClient.AddItem(h.Context, &rpccart.AddItemReq{\n\t\tUserId: frontendutils.GetUserIdFromCtx(h.Context),\n\t\tItem: &rpccart.CartItem{\n\t\t\tProductId: req.ProductId,\n\t\t\tQuantity:  req.ProductNum,\n\t\t},\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcategory \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/category\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CategoryService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCategoryService(Context context.Context, RequestContext *app.RequestContext) *CategoryService {\n\treturn &CategoryService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CategoryService) Run(req *category.CategoryReq) (resp map[string]any, err error) {\n\tp, _ := rpc.ProductClient.ListProducts(h.Context, &product.ListProductsReq{CategoryName: req.Category})\n\treturn utils.H{\n\t\t\"title\":    \"Category\",\n\t\t\"items\":    p.Products,\n\t\t\"cart_num\": 10,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/checkout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutService(Context context.Context, RequestContext *app.RequestContext) *CheckoutService {\n\treturn &CheckoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.ProductId})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\n\t\t\t\"Name\":    p.Name,\n\t\t\t\"Price\":   strconv.FormatFloat(float64(p.Price), 'f', 2, 64),\n\t\t\t\"Picture\": p.Picture,\n\t\t\t\"Qty\":     strconv.Itoa(int(v.Quantity)),\n\t\t})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"Checkout\",\n\t\t\"items\":    items,\n\t\t\"cart_num\": len(items),\n\t\t\"total\":    strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/checkout_result.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\ntype CheckoutResultService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutResultService(Context context.Context, RequestContext *app.RequestContext) *CheckoutResultService {\n\treturn &CheckoutResultService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutResultService) Run(req *common.Empty) (resp map[string]any, err error) {\n\treturn utils.H{}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/checkout_waiting.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/checkout\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\trpcpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype CheckoutWaitingService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewCheckoutWaitingService(Context context.Context, RequestContext *app.RequestContext) *CheckoutWaitingService {\n\treturn &CheckoutWaitingService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *CheckoutWaitingService) Run(req *checkout.CheckoutReq) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\t_, err = rpc.CheckoutClient.Checkout(h.Context, &rpccheckout.CheckoutReq{\n\t\tUserId:    userId,\n\t\tEmail:     req.Email,\n\t\tFirstname: req.Firstname,\n\t\tLastname:  req.Lastname,\n\t\tAddress: &rpccheckout.Address{\n\t\t\tCountry:       req.Country,\n\t\t\tZipCode:       req.Zipcode,\n\t\t\tCity:          req.City,\n\t\t\tState:         req.Province,\n\t\t\tStreetAddress: req.Street,\n\t\t},\n\t\tCreditCard: &rpcpayment.CreditCardInfo{\n\t\t\tCreditCardNumber:          req.CardNum,\n\t\t\tCreditCardExpirationYear:  req.ExpirationYear,\n\t\t\tCreditCardExpirationMonth: req.ExpirationMonth,\n\t\t\tCreditCardCvv:             req.Cvv,\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn utils.H{\n\t\t\"title\":    \"waiting\",\n\t\t\"redirect\": \"/checkout/result\",\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/get_cart.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpccart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetCartService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetCartService(Context context.Context, RequestContext *app.RequestContext) *GetCartService {\n\treturn &GetCartService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetCartService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tvar items []map[string]string\n\tcarts, err := rpc.CartClient.GetCart(h.Context, &rpccart.GetCartReq{\n\t\tUserId: uint32(h.Context.Value(frontendutils.UserIdKey).(float64)),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar total float32\n\tfor _, v := range carts.Cart.Items {\n\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: v.GetProductId()})\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif productResp.Product == nil {\n\t\t\tcontinue\n\t\t}\n\t\tp := productResp.Product\n\t\titems = append(items, map[string]string{\"Name\": p.Name, \"Description\": p.Description, \"Picture\": p.Picture, \"Price\": strconv.FormatFloat(float64(p.Price), 'f', 2, 64), \"Qty\": strconv.Itoa(int(v.Quantity))})\n\t\ttotal += float32(v.Quantity) * p.Price\n\t}\n\n\treturn utils.H{\n\t\t\"title\": \"Cart\",\n\t\t\"items\": items,\n\t\t\"total\": strconv.FormatFloat(float64(total), 'f', 2, 64),\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tproduct \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype GetProductService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewGetProductService(Context context.Context, RequestContext *app.RequestContext) *GetProductService {\n\treturn &GetProductService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *GetProductService) Run(req *product.ProductReq) (resp map[string]any, err error) {\n\tp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: req.GetId()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn utils.H{\n\t\t\"item\": p.Product,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/home.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype HomeService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewHomeService(Context context.Context, RequestContext *app.RequestContext) *HomeService {\n\treturn &HomeService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *HomeService) Run(req *common.Empty) (res map[string]any, err error) {\n\tctx := h.Context\n\tp, err := rpc.ProductClient.ListProducts(ctx, &product.ListProductsReq{})\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n\tvar cartNum int\n\treturn utils.H{\n\t\t\"title\":    \"Hot sale\",\n\t\t\"cart_num\": cartNum,\n\t\t\"items\":    p.Products,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LoginService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLoginService(Context context.Context, RequestContext *app.RequestContext) *LoginService {\n\treturn &LoginService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LoginService) Run(req *auth.LoginReq) (resp string, err error) {\n\tres, err := rpc.UserClient.Login(h.Context, &rpcuser.LoginReq{Email: req.Email, Password: req.Password})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\tfrontendutils.MustHandleError(err)\n\tredirect := \"/\"\n\tif frontendutils.ValidateNext(req.Next) {\n\t\tredirect = req.Next\n\t}\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn redirect, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/logout.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype LogoutService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewLogoutService(Context context.Context, RequestContext *app.RequestContext) *LogoutService {\n\treturn &LogoutService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *LogoutService) Run(req *common.Empty) (resp *common.Empty, err error) {\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Clear()\n\tsession.Save() //nolint:errcheck\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/order_list.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/types\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\trpcorder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\trpcproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\ntype OrderListService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewOrderListService(Context context.Context, RequestContext *app.RequestContext) *OrderListService {\n\treturn &OrderListService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *OrderListService) Run(req *common.Empty) (resp map[string]any, err error) {\n\tuserId := frontendutils.GetUserIdFromCtx(h.Context)\n\tvar orders []*types.Order\n\tlistOrderResp, err := rpc.OrderClient.ListOrder(h.Context, &rpcorder.ListOrderReq{UserId: userId})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif listOrderResp == nil || len(listOrderResp.Orders) == 0 {\n\t\treturn utils.H{\n\t\t\t\"title\":  \"Order\",\n\t\t\t\"orders\": orders,\n\t\t}, nil\n\t}\n\n\tfor _, v := range listOrderResp.Orders {\n\t\tvar items []types.OrderItem\n\t\tvar total float32\n\t\tif len(v.OrderItems) > 0 {\n\t\t\tfor _, vv := range v.OrderItems {\n\t\t\t\ttotal += vv.Cost\n\t\t\t\ti := vv.Item\n\t\t\t\tproductResp, err := rpc.ProductClient.GetProduct(h.Context, &rpcproduct.GetProductReq{Id: i.ProductId})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif productResp.Product == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tp := productResp.Product\n\t\t\t\titems = append(items, types.OrderItem{\n\t\t\t\t\tProductId:   i.ProductId,\n\t\t\t\t\tQty:         uint32(i.Quantity),\n\t\t\t\t\tProductName: p.Name,\n\t\t\t\t\tPicture:     p.Picture,\n\t\t\t\t\tCost:        vv.Cost,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\ttimeObj := time.Unix(int64(v.CreatedAt), 0)\n\t\torders = append(orders, &types.Order{\n\t\t\tCost:        total,\n\t\t\tItems:       items,\n\t\t\tCreatedDate: timeObj.Format(\"2006-01-02 15:04:05\"),\n\t\t\tOrderId:     v.OrderId,\n\t\t\tConsignee:   types.Consignee{Email: v.Email},\n\t\t})\n\t}\n\n\treturn utils.H{\n\t\t\"title\":  \"Order\",\n\t\t\"orders\": orders,\n\t}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tauth \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/auth\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\trpcuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\ntype RegisterService struct {\n\tRequestContext *app.RequestContext\n\tContext        context.Context\n}\n\nfunc NewRegisterService(Context context.Context, RequestContext *app.RequestContext) *RegisterService {\n\treturn &RegisterService{RequestContext: RequestContext, Context: Context}\n}\n\nfunc (h *RegisterService) Run(req *auth.RegisterReq) (resp *common.Empty, err error) {\n\tres, err := rpc.UserClient.Register(h.Context, &rpcuser.RegisterReq{\n\t\tEmail:           req.Email,\n\t\tPassword:        req.Password,\n\t\tConfirmPassword: req.Password,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsession := sessions.Default(h.RequestContext)\n\tsession.Set(\"user_id\", res.UserId)\n\terr = session.Save()\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/biz/utils/resp.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n)\n\n// SendErrResponse  pack error response\nfunc SendErrResponse(ctx context.Context, c *app.RequestContext, code int, err error) {\n\t// todo edit custom code\n\tc.String(code, err.Error())\n}\n\n// SendSuccessResponse  pack success response\nfunc SendSuccessResponse(ctx context.Context, c *app.RequestContext, code int, data interface{}) {\n\t// todo edit custom code\n\tc.JSON(code, data)\n}\n\nfunc WarpResponse(ctx context.Context, c *app.RequestContext, content map[string]any) map[string]any {\n\tvar cartNum int\n\tuserId := frontendutils.GetUserIdFromCtx(ctx)\n\tcartResp, _ := rpc.CartClient.GetCart(ctx, &cart.GetCartReq{UserId: userId})\n\tif cartResp != nil && cartResp.Cart != nil {\n\t\tcartNum = len(cartResp.Cart.Items)\n\t}\n\tcontent[\"user_id\"] = ctx.Value(frontendutils.UserIdKey)\n\tcontent[\"cart_num\"] = cartNum\n\treturn content\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/build.sh",
    "content": "#!/bin/bash\nRUN_NAME=frontend\nmkdir -p output/bin output/conf\ncp script/bootstrap.sh output 2>/dev/null\nchmod +x output/bootstrap.sh\ncp -r conf/* output/conf\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv string\n\n\tHertz Hertz `yaml:\"hertz\"`\n\tMySQL MySQL `yaml:\"mysql\"`\n\tRedis Redis `yaml:\"redis\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tPassword string `yaml:\"password\"`\n\tUsername string `yaml:\"username\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Hertz struct {\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     int    `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n\tRegistryAddr    string `yaml:\"registry_addr\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\thlog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\thlog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\n\tconf.Env = GetEnv()\n\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() hlog.Level {\n\tlevel := GetConf().Hertz.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn hlog.LevelTrace\n\tcase \"debug\":\n\t\treturn hlog.LevelDebug\n\tcase \"info\":\n\t\treturn hlog.LevelInfo\n\tcase \"notice\":\n\t\treturn hlog.LevelNotice\n\tcase \"warn\":\n\t\treturn hlog.LevelWarn\n\tcase \"error\":\n\t\treturn hlog.LevelError\n\tcase \"fatal\":\n\t\treturn hlog.LevelFatal\n\tdefault:\n\t\treturn hlog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/conf/dev/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/conf/online/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: false\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/conf/test/conf.yaml",
    "content": "hertz:\n  address: \":8080\"\n  metrics_port: 8090\n  enable_pprof: true\n  enable_gzip: true\n  enable_access_log: true\n  log_level: info\n  log_file_name: \"log/hertz.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n  registry_addr: \"localhost:8500\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/frontend\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/hertz v0.7.3\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/hashicorp/consul/api v1.26.1\n\tgithub.com/hertz-contrib/cors v0.1.0\n\tgithub.com/hertz-contrib/gzip v0.0.3\n\tgithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b\n\tgithub.com/hertz-contrib/logger/zap v1.1.0\n\tgithub.com/hertz-contrib/monitor-prometheus v0.1.2\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3\n\tgithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1\n\tgithub.com/hertz-contrib/pprof v0.1.1\n\tgithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b\n\tgithub.com/hertz-contrib/sessions v1.0.3\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/prometheus/client_golang v1.19.0\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.opentelemetry.io/otel v1.25.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0\n\tgo.opentelemetry.io/otel/sdk v1.25.0\n\tgo.opentelemetry.io/otel/trace v1.25.0\n\tgo.uber.org/zap v1.27.0\n\tgoogle.golang.org/protobuf v1.36.6\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/andeya/ameda v1.5.3 // indirect\n\tgithub.com/andeya/goutil v1.0.1 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.11 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/fgprof v0.9.3 // indirect\n\tgithub.com/fsnotify/fsnotify v1.7.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/gomodule/redigo v1.8.9 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.2 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.3.0 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/andeya/ameda v1.5.3 h1:SvqnhQPZwwabS8HQTRGfJwWPl2w9ZIPInHAw9aE1Wlk=\ngithub.com/andeya/ameda v1.5.3/go.mod h1:FQDHRe1I995v6GG+8aJ7UIUToEmbdTJn/U26NCPIgXQ=\ngithub.com/andeya/goutil v1.0.1 h1:eiYwVyAnnK0dXU5FJsNjExkJW4exUGn/xefPt3k4eXg=\ngithub.com/andeya/goutil v1.0.1/go.mod h1:jEG5/QnnhG7yGxwFUX6Q+JGMif7sjdHmmNVjn7nhJDo=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11 h1:jJgmoDKPKacGl0llPYbYL/+/2N+Ng0vV0ipbnVssXHY=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11/go.mod h1:UAyKh4ZRLBPGsyTRFZoPqTni1TlojMdOJXQnEIPCX84=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.3.5/go.mod h1:V973WhNhGmvHxW6nQmsHEfHaoU9F3zTF+93rH03hcUQ=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.3.2/go.mod h1:hnv3B7eZ6kMv7CKFHT2OC4LU0mA4s5XPyu/SbixLcrU=\ngithub.com/cloudwego/hertz v0.6.0/go.mod h1:83EedHQvCXpveYh2r9us8YlQ1C28vPg93wPdB/QpJiA=\ngithub.com/cloudwego/hertz v0.6.2/go.mod h1:2em2hGREvCBawsTQcQxyWBGVlCeo+N1pp2q0HkkbwR0=\ngithub.com/cloudwego/hertz v0.6.8/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0BzwevwA=\ngithub.com/cloudwego/hertz v0.7.2/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.6/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=\ngithub.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=\ngithub.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=\ngithub.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=\ngithub.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.15.0/go.mod h1:bcaw5CSZ7NE9qfOfKCI1xb7ZKjzu/MyvQkCLTfqLqxQ=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.10.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/cors v0.1.0 h1:PQ5mATygSMzTlYtfyMyHjobYoJeHKe2Qt3tcAOgbI6E=\ngithub.com/hertz-contrib/cors v0.1.0/go.mod h1:VPReoq+Rvu/lZOfpp5CcX3x4mpZUc3EpSXBcVDcbvOc=\ngithub.com/hertz-contrib/gzip v0.0.3 h1:x+XamFkUYhPPqMzGWejPh1wdDiwkIpHkgRVIg74Xvt4=\ngithub.com/hertz-contrib/gzip v0.0.3/go.mod h1:5rQsvQp1qBmt2TYATbbofNAJBSws2Wwst4EdiHLbx4w=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b h1:RoBp+TurP+46VZl31VMV+6wO2SlNlXwyVwjc93s5/tI=\ngithub.com/hertz-contrib/logger/accesslog v0.0.0-20231211035138-acc7b4e2984b/go.mod h1:vB3TNAD0IvvDhfY1SWSeCaAVbWleDKEuQ4zOK70hb64=\ngithub.com/hertz-contrib/logger/zap v1.1.0 h1:4efINiIDJrXEtAFeEdDJvc3Hye0VFxp+0X4BwaZgxNs=\ngithub.com/hertz-contrib/logger/zap v1.1.0/go.mod h1:D/rJJgsYn+SGaHVfVqWS3vHTbbc7ODAlJO+6smWgTeE=\ngithub.com/hertz-contrib/monitor-prometheus v0.1.2 h1:MYZGi4uStLtHKUm7+kc/ljbxzUTDE9H5FPCTSB/p7ZM=\ngithub.com/hertz-contrib/monitor-prometheus v0.1.2/go.mod h1:aUP6t5bK8msuf+5dN/k8099IjD0u8s9A6vrYWQ+yzN0=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1 h1:N/rbPCZgrupBNjTEe8Cq+cnTOpgj/y4SU6MYe6uQl0g=\ngithub.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1/go.mod h1:oEnsG4CpBuLx1vcCnxpE/MsNHUrF4qQKw8DiOdtdBa0=\ngithub.com/hertz-contrib/pprof v0.1.1 h1:x7kOFUtqkveXbDbiISIFE3x02cAtcb6/DBjHgsJmYcM=\ngithub.com/hertz-contrib/pprof v0.1.1/go.mod h1:9g23VQrcC4AjW++VA2relquyMXPVfs/s+t5FBIjIIOs=\ngithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b h1:DIfogbZyBmOYUkkS0jGDNT03jqVPtHypQrZ0mhcASUE=\ngithub.com/hertz-contrib/registry/consul v0.0.0-20231110170354-519baf74ea6b/go.mod h1:bjNZ+0osz/GmRMEXZAMeme+qE7WV6g4DEtX/TdfXzvo=\ngithub.com/hertz-contrib/sessions v1.0.3 h1:lXBcmpPlMUhVSua54lxrIzJwhKXaI6zZcc+RgQx8xrE=\ngithub.com/hertz-contrib/sessions v1.0.3/go.mod h1:46/DHSScV2EcK08er3IFvGHbh6a7VLMMiMlI+30QXoA=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/nyaruka/phonenumbers v1.3.0 h1:IFyyJfF2Elg8xGKFghWrRXzb6qAHk+Q3uPqmIgS20JQ=\ngithub.com/nyaruka/phonenumbers v1.3.0/go.mod h1:4jyKp/BFUokLbCHyoZag+T3S1KezFVoEKtgnbpzItC4=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/hertz_gen/api/api.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: api.proto\n\npackage api\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar file_api_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50101,\n\t\tName:          \"api.raw_body\",\n\t\tTag:           \"bytes,50101,opt,name=raw_body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50102,\n\t\tName:          \"api.query\",\n\t\tTag:           \"bytes,50102,opt,name=query\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50103,\n\t\tName:          \"api.header\",\n\t\tTag:           \"bytes,50103,opt,name=header\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50104,\n\t\tName:          \"api.cookie\",\n\t\tTag:           \"bytes,50104,opt,name=cookie\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50105,\n\t\tName:          \"api.body\",\n\t\tTag:           \"bytes,50105,opt,name=body\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50106,\n\t\tName:          \"api.path\",\n\t\tTag:           \"bytes,50106,opt,name=path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50107,\n\t\tName:          \"api.vd\",\n\t\tTag:           \"bytes,50107,opt,name=vd\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50108,\n\t\tName:          \"api.form\",\n\t\tTag:           \"bytes,50108,opt,name=form\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50109,\n\t\tName:          \"api.js_conv\",\n\t\tTag:           \"bytes,50109,opt,name=js_conv\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50110,\n\t\tName:          \"api.file_name\",\n\t\tTag:           \"bytes,50110,opt,name=file_name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50111,\n\t\tName:          \"api.none\",\n\t\tTag:           \"bytes,50111,opt,name=none\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50131,\n\t\tName:          \"api.form_compatible\",\n\t\tTag:           \"bytes,50131,opt,name=form_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50132,\n\t\tName:          \"api.js_conv_compatible\",\n\t\tTag:           \"bytes,50132,opt,name=js_conv_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50133,\n\t\tName:          \"api.file_name_compatible\",\n\t\tTag:           \"bytes,50133,opt,name=file_name_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50134,\n\t\tName:          \"api.none_compatible\",\n\t\tTag:           \"bytes,50134,opt,name=none_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         51001,\n\t\tName:          \"api.go_tag\",\n\t\tTag:           \"bytes,51001,opt,name=go_tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50201,\n\t\tName:          \"api.get\",\n\t\tTag:           \"bytes,50201,opt,name=get\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50202,\n\t\tName:          \"api.post\",\n\t\tTag:           \"bytes,50202,opt,name=post\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50203,\n\t\tName:          \"api.put\",\n\t\tTag:           \"bytes,50203,opt,name=put\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50204,\n\t\tName:          \"api.delete\",\n\t\tTag:           \"bytes,50204,opt,name=delete\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50205,\n\t\tName:          \"api.patch\",\n\t\tTag:           \"bytes,50205,opt,name=patch\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50206,\n\t\tName:          \"api.options\",\n\t\tTag:           \"bytes,50206,opt,name=options\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50207,\n\t\tName:          \"api.head\",\n\t\tTag:           \"bytes,50207,opt,name=head\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50208,\n\t\tName:          \"api.any\",\n\t\tTag:           \"bytes,50208,opt,name=any\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50301,\n\t\tName:          \"api.gen_path\",\n\t\tTag:           \"bytes,50301,opt,name=gen_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50302,\n\t\tName:          \"api.api_version\",\n\t\tTag:           \"bytes,50302,opt,name=api_version\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50303,\n\t\tName:          \"api.tag\",\n\t\tTag:           \"bytes,50303,opt,name=tag\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50304,\n\t\tName:          \"api.name\",\n\t\tTag:           \"bytes,50304,opt,name=name\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50305,\n\t\tName:          \"api.api_level\",\n\t\tTag:           \"bytes,50305,opt,name=api_level\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50306,\n\t\tName:          \"api.serializer\",\n\t\tTag:           \"bytes,50306,opt,name=serializer\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50307,\n\t\tName:          \"api.param\",\n\t\tTag:           \"bytes,50307,opt,name=param\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50308,\n\t\tName:          \"api.baseurl\",\n\t\tTag:           \"bytes,50308,opt,name=baseurl\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50309,\n\t\tName:          \"api.handler_path\",\n\t\tTag:           \"bytes,50309,opt,name=handler_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50331,\n\t\tName:          \"api.handler_path_compatible\",\n\t\tTag:           \"bytes,50331,opt,name=handler_path_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*int32)(nil),\n\t\tField:         50401,\n\t\tName:          \"api.http_code\",\n\t\tTag:           \"varint,50401,opt,name=http_code\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50402,\n\t\tName:          \"api.base_domain\",\n\t\tTag:           \"bytes,50402,opt,name=base_domain\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50731,\n\t\tName:          \"api.base_domain_compatible\",\n\t\tTag:           \"bytes,50731,opt,name=base_domain_compatible\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50732,\n\t\tName:          \"api.service_path\",\n\t\tTag:           \"bytes,50732,opt,name=service_path\",\n\t\tFilename:      \"api.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*string)(nil),\n\t\tField:         50830,\n\t\tName:          \"api.reserve\",\n\t\tTag:           \"bytes,50830,opt,name=reserve\",\n\t\tFilename:      \"api.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional string raw_body = 50101;\n\tE_RawBody = &file_api_proto_extTypes[0]\n\t// optional string query = 50102;\n\tE_Query = &file_api_proto_extTypes[1]\n\t// optional string header = 50103;\n\tE_Header = &file_api_proto_extTypes[2]\n\t// optional string cookie = 50104;\n\tE_Cookie = &file_api_proto_extTypes[3]\n\t// optional string body = 50105;\n\tE_Body = &file_api_proto_extTypes[4]\n\t// optional string path = 50106;\n\tE_Path = &file_api_proto_extTypes[5]\n\t// optional string vd = 50107;\n\tE_Vd = &file_api_proto_extTypes[6]\n\t// optional string form = 50108;\n\tE_Form = &file_api_proto_extTypes[7]\n\t// optional string js_conv = 50109;\n\tE_JsConv = &file_api_proto_extTypes[8]\n\t// optional string file_name = 50110;\n\tE_FileName = &file_api_proto_extTypes[9]\n\t// optional string none = 50111;\n\tE_None = &file_api_proto_extTypes[10]\n\t// 50131~50160 used to extend field option by hz\n\t//\n\t// optional string form_compatible = 50131;\n\tE_FormCompatible = &file_api_proto_extTypes[11]\n\t// optional string js_conv_compatible = 50132;\n\tE_JsConvCompatible = &file_api_proto_extTypes[12]\n\t// optional string file_name_compatible = 50133;\n\tE_FileNameCompatible = &file_api_proto_extTypes[13]\n\t// optional string none_compatible = 50134;\n\tE_NoneCompatible = &file_api_proto_extTypes[14]\n\t// optional string go_tag = 51001;\n\tE_GoTag = &file_api_proto_extTypes[15]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional string get = 50201;\n\tE_Get = &file_api_proto_extTypes[16]\n\t// optional string post = 50202;\n\tE_Post = &file_api_proto_extTypes[17]\n\t// optional string put = 50203;\n\tE_Put = &file_api_proto_extTypes[18]\n\t// optional string delete = 50204;\n\tE_Delete = &file_api_proto_extTypes[19]\n\t// optional string patch = 50205;\n\tE_Patch = &file_api_proto_extTypes[20]\n\t// optional string options = 50206;\n\tE_Options = &file_api_proto_extTypes[21]\n\t// optional string head = 50207;\n\tE_Head = &file_api_proto_extTypes[22]\n\t// optional string any = 50208;\n\tE_Any = &file_api_proto_extTypes[23]\n\t// optional string gen_path = 50301;\n\tE_GenPath = &file_api_proto_extTypes[24] // The path specified by the user when the client code is\n\t// generated, with a higher priority than api_version\n\t//\n\t// optional string api_version = 50302;\n\tE_ApiVersion = &file_api_proto_extTypes[25] // Specify the value of the :version variable in path when the\n\t// client code is generated\n\t//\n\t// optional string tag = 50303;\n\tE_Tag = &file_api_proto_extTypes[26] // rpc tag, can be multiple, separated by commas\n\t// optional string name = 50304;\n\tE_Name = &file_api_proto_extTypes[27] // Name of rpc\n\t// optional string api_level = 50305;\n\tE_ApiLevel = &file_api_proto_extTypes[28] // Interface Level\n\t// optional string serializer = 50306;\n\tE_Serializer = &file_api_proto_extTypes[29] // Serialization method\n\t// optional string param = 50307;\n\tE_Param = &file_api_proto_extTypes[30] // Whether client requests take public parameters\n\t// optional string baseurl = 50308;\n\tE_Baseurl = &file_api_proto_extTypes[31] // Baseurl used in ttnet routing\n\t// optional string handler_path = 50309;\n\tE_HandlerPath = &file_api_proto_extTypes[32] // handler_path specifies the path to generate the method\n\t// 50331~50360 used to extend method option by hz\n\t//\n\t// optional string handler_path_compatible = 50331;\n\tE_HandlerPathCompatible = &file_api_proto_extTypes[33] // handler_path specifies the path to generate the method\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional int32 http_code = 50401;\n\tE_HttpCode = &file_api_proto_extTypes[34]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional string base_domain = 50402;\n\tE_BaseDomain = &file_api_proto_extTypes[35]\n\t// 50731~50760 used to extend service option by hz\n\t//\n\t// optional string base_domain_compatible = 50731;\n\tE_BaseDomainCompatible = &file_api_proto_extTypes[36]\n\t// optional string service_path = 50732;\n\tE_ServicePath = &file_api_proto_extTypes[37]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional string reserve = 50830;\n\tE_Reserve = &file_api_proto_extTypes[38]\n)\n\nvar File_api_proto protoreflect.FileDescriptor\n\nvar file_api_proto_rawDesc = []byte{\n\t0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x3a, 0x3d, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb5, 0x87,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01,\n\t0x01, 0x3a, 0x38, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb6, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb7, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69,\n\t0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb8, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,\n\t0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb9, 0x87, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xba, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x88, 0x01, 0x01, 0x3a, 0x32, 0x0a, 0x02, 0x76, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbb, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x76, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbc,\n\t0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x88, 0x01, 0x01, 0x3a,\n\t0x3b, 0x0a, 0x07, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbd, 0x87, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x0a, 0x09,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbe, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a,\n\t0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x18, 0xbf, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88,\n\t0x01, 0x01, 0x3a, 0x50, 0x0a, 0x12, 0x6a, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x5f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd4, 0x87, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x10, 0x6a, 0x73, 0x43, 0x6f, 0x6e, 0x76, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x54, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd5, 0x87, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d,\n\t0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x4b, 0x0a, 0x0f, 0x6e, 0x6f,\n\t0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd6, 0x87, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,\n\t0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x06, 0x67, 0x6f, 0x5f, 0x74, 0x61,\n\t0x67, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xb9, 0x8e, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6f, 0x54, 0x61, 0x67, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x99, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x9a, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x88,\n\t0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x88, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x3a, 0x3b, 0x0a, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x9c, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x9d, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9e, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,\n\t0x3a, 0x37, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9f, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x61, 0x6e, 0x79,\n\t0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa0, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x88, 0x01, 0x01,\n\t0x3a, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d,\n\t0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xfd, 0x88, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01,\n\t0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xfe, 0x88, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x35, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xff, 0x88,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x37, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x80, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x40, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x81, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x69,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x82, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x39, 0x0a,\n\t0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x83, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x3a, 0x3d, 0x0a, 0x07, 0x62, 0x61, 0x73, 0x65,\n\t0x75, 0x72, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x84, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73,\n\t0x65, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x46, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a,\n\t0x5b, 0x0a, 0x17, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x89, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x43, 0x0a, 0x09,\n\t0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe1, 0x89, 0x03,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01,\n\t0x01, 0x3a, 0x45, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,\n\t0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0xe2, 0x89, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x44,\n\t0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x5a, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,\n\t0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xab, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x73,\n\t0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,\n\t0x65, 0x88, 0x01, 0x01, 0x3a, 0x47, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xac, 0x8c, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x3a, 0x3e, 0x0a,\n\t0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x8e, 0x8d, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x88, 0x01, 0x01, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_api_proto_goTypes = []interface{}{\n\t(*descriptorpb.FieldOptions)(nil),     // 0: google.protobuf.FieldOptions\n\t(*descriptorpb.MethodOptions)(nil),    // 1: google.protobuf.MethodOptions\n\t(*descriptorpb.EnumValueOptions)(nil), // 2: google.protobuf.EnumValueOptions\n\t(*descriptorpb.ServiceOptions)(nil),   // 3: google.protobuf.ServiceOptions\n\t(*descriptorpb.MessageOptions)(nil),   // 4: google.protobuf.MessageOptions\n}\nvar file_api_proto_depIdxs = []int32{\n\t0,  // 0: api.raw_body:extendee -> google.protobuf.FieldOptions\n\t0,  // 1: api.query:extendee -> google.protobuf.FieldOptions\n\t0,  // 2: api.header:extendee -> google.protobuf.FieldOptions\n\t0,  // 3: api.cookie:extendee -> google.protobuf.FieldOptions\n\t0,  // 4: api.body:extendee -> google.protobuf.FieldOptions\n\t0,  // 5: api.path:extendee -> google.protobuf.FieldOptions\n\t0,  // 6: api.vd:extendee -> google.protobuf.FieldOptions\n\t0,  // 7: api.form:extendee -> google.protobuf.FieldOptions\n\t0,  // 8: api.js_conv:extendee -> google.protobuf.FieldOptions\n\t0,  // 9: api.file_name:extendee -> google.protobuf.FieldOptions\n\t0,  // 10: api.none:extendee -> google.protobuf.FieldOptions\n\t0,  // 11: api.form_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 12: api.js_conv_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 13: api.file_name_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 14: api.none_compatible:extendee -> google.protobuf.FieldOptions\n\t0,  // 15: api.go_tag:extendee -> google.protobuf.FieldOptions\n\t1,  // 16: api.get:extendee -> google.protobuf.MethodOptions\n\t1,  // 17: api.post:extendee -> google.protobuf.MethodOptions\n\t1,  // 18: api.put:extendee -> google.protobuf.MethodOptions\n\t1,  // 19: api.delete:extendee -> google.protobuf.MethodOptions\n\t1,  // 20: api.patch:extendee -> google.protobuf.MethodOptions\n\t1,  // 21: api.options:extendee -> google.protobuf.MethodOptions\n\t1,  // 22: api.head:extendee -> google.protobuf.MethodOptions\n\t1,  // 23: api.any:extendee -> google.protobuf.MethodOptions\n\t1,  // 24: api.gen_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 25: api.api_version:extendee -> google.protobuf.MethodOptions\n\t1,  // 26: api.tag:extendee -> google.protobuf.MethodOptions\n\t1,  // 27: api.name:extendee -> google.protobuf.MethodOptions\n\t1,  // 28: api.api_level:extendee -> google.protobuf.MethodOptions\n\t1,  // 29: api.serializer:extendee -> google.protobuf.MethodOptions\n\t1,  // 30: api.param:extendee -> google.protobuf.MethodOptions\n\t1,  // 31: api.baseurl:extendee -> google.protobuf.MethodOptions\n\t1,  // 32: api.handler_path:extendee -> google.protobuf.MethodOptions\n\t1,  // 33: api.handler_path_compatible:extendee -> google.protobuf.MethodOptions\n\t2,  // 34: api.http_code:extendee -> google.protobuf.EnumValueOptions\n\t3,  // 35: api.base_domain:extendee -> google.protobuf.ServiceOptions\n\t3,  // 36: api.base_domain_compatible:extendee -> google.protobuf.ServiceOptions\n\t3,  // 37: api.service_path:extendee -> google.protobuf.ServiceOptions\n\t4,  // 38: api.reserve:extendee -> google.protobuf.MessageOptions\n\t39, // [39:39] is the sub-list for method output_type\n\t39, // [39:39] is the sub-list for method input_type\n\t39, // [39:39] is the sub-list for extension type_name\n\t0,  // [0:39] is the sub-list for extension extendee\n\t0,  // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_api_proto_init() }\nfunc file_api_proto_init() {\n\tif File_api_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_api_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 39,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_api_proto_goTypes,\n\t\tDependencyIndexes: file_api_proto_depIdxs,\n\t\tExtensionInfos:    file_api_proto_extTypes,\n\t}.Build()\n\tFile_api_proto = out.File\n\tfile_api_proto_rawDesc = nil\n\tfile_api_proto_goTypes = nil\n\tfile_api_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/hertz_gen/frontend/auth/auth_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: auth_page.proto\n\npackage auth\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\" form:\"confirm_password\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\" form:\"password\"`\n\tNext     string `protobuf:\"bytes,3,opt,name=next,proto3\" json:\"next,omitempty\" query:\"next\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_auth_page_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_auth_page_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_auth_page_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetNext() string {\n\tif x != nil {\n\t\treturn x.Next\n\t}\n\treturn \"\"\n}\n\nvar File_auth_page_proto protoreflect.FileDescriptor\n\nvar file_auth_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52,\n\t0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a,\n\t0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xe2, 0xbb, 0x18, 0x10, 0x63, 0x6f, 0x6e,\n\t0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x73,\n\t0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x08, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2,\n\t0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0xb2, 0xbb, 0x18, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x04, 0x6e,\n\t0x65, 0x78, 0x74, 0x32, 0xf8, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12,\n\t0x1a, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e,\n\t0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d,\n\t0x70, 0x74, 0x79, 0x22, 0x12, 0xd2, 0xc1, 0x18, 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72,\n\t0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x12, 0x17, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68,\n\t0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0f, 0xd2, 0xc1, 0x18, 0x0b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67,\n\t0x69, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0xd2, 0xc1,\n\t0x18, 0x0c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x42, 0x4b,\n\t0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_auth_page_proto_rawDescOnce sync.Once\n\tfile_auth_page_proto_rawDescData = file_auth_page_proto_rawDesc\n)\n\nfunc file_auth_page_proto_rawDescGZIP() []byte {\n\tfile_auth_page_proto_rawDescOnce.Do(func() {\n\t\tfile_auth_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_page_proto_rawDescData)\n\t})\n\treturn file_auth_page_proto_rawDescData\n}\n\nvar file_auth_page_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_auth_page_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: frontend.auth.RegisterReq\n\t(*LoginReq)(nil),     // 1: frontend.auth.LoginReq\n\t(*common.Empty)(nil), // 2: frontend.common.Empty\n}\nvar file_auth_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.auth.AuthService.register:input_type -> frontend.auth.RegisterReq\n\t1, // 1: frontend.auth.AuthService.login:input_type -> frontend.auth.LoginReq\n\t2, // 2: frontend.auth.AuthService.logout:input_type -> frontend.common.Empty\n\t2, // 3: frontend.auth.AuthService.register:output_type -> frontend.common.Empty\n\t2, // 4: frontend.auth.AuthService.login:output_type -> frontend.common.Empty\n\t2, // 5: frontend.auth.AuthService.logout:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_auth_page_proto_init() }\nfunc file_auth_page_proto_init() {\n\tif File_auth_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_auth_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_auth_page_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_auth_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_auth_page_proto_goTypes,\n\t\tDependencyIndexes: file_auth_page_proto_depIdxs,\n\t\tMessageInfos:      file_auth_page_proto_msgTypes,\n\t}.Build()\n\tFile_auth_page_proto = out.File\n\tfile_auth_page_proto_rawDesc = nil\n\tfile_auth_page_proto_goTypes = nil\n\tfile_auth_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/hertz_gen/frontend/cart/cart_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: cart_page.proto\n\npackage cart\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype AddCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId  uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\" form:\"productId\"`\n\tProductNum int32  `protobuf:\"varint,2,opt,name=product_num,json=productNum,proto3\" json:\"product_num,omitempty\" form:\"productNum\"`\n}\n\nfunc (x *AddCartReq) Reset() {\n\t*x = AddCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddCartReq) ProtoMessage() {}\n\nfunc (x *AddCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddCartReq.ProtoReflect.Descriptor instead.\nfunc (*AddCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AddCartReq) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *AddCartReq) GetProductNum() int32 {\n\tif x != nil {\n\t\treturn x.ProductNum\n\t}\n\treturn 0\n}\n\nvar File_cart_page_proto protoreflect.FileDescriptor\n\nvar file_cart_page_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x6b, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71,\n\t0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x42, 0x0d, 0xe2, 0xbb, 0x18, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x49, 0x64, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x2f,\n\t0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x05, 0x42, 0x0e, 0xe2, 0xbb, 0x18, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x4e, 0x75, 0x6d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x32,\n\t0xa0, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x4b, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x19,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x09, 0xd2, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,\n\t0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x09, 0xca, 0xc1, 0x18, 0x05, 0x2f, 0x63, 0x61,\n\t0x72, 0x74, 0x42, 0x4b, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64,\n\t0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_page_proto_rawDescOnce sync.Once\n\tfile_cart_page_proto_rawDescData = file_cart_page_proto_rawDesc\n)\n\nfunc file_cart_page_proto_rawDescGZIP() []byte {\n\tfile_cart_page_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_page_proto_rawDescData)\n\t})\n\treturn file_cart_page_proto_rawDescData\n}\n\nvar file_cart_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_cart_page_proto_goTypes = []interface{}{\n\t(*AddCartReq)(nil),   // 0: frontend.cart.AddCartReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_cart_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.cart.CartService.AddCartItem:input_type -> frontend.cart.AddCartReq\n\t1, // 1: frontend.cart.CartService.GetCart:input_type -> frontend.common.Empty\n\t1, // 2: frontend.cart.CartService.AddCartItem:output_type -> frontend.common.Empty\n\t1, // 3: frontend.cart.CartService.GetCart:output_type -> frontend.common.Empty\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_page_proto_init() }\nfunc file_cart_page_proto_init() {\n\tif File_cart_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_page_proto_goTypes,\n\t\tDependencyIndexes: file_cart_page_proto_depIdxs,\n\t\tMessageInfos:      file_cart_page_proto_msgTypes,\n\t}.Build()\n\tFile_cart_page_proto = out.File\n\tfile_cart_page_proto_rawDesc = nil\n\tfile_cart_page_proto_goTypes = nil\n\tfile_cart_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/hertz_gen/frontend/category/category_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: category_page.proto\n\npackage category\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CategoryReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory string `protobuf:\"bytes,1,opt,name=category,proto3\" json:\"category,omitempty\" path:\"category\"`\n}\n\nfunc (x *CategoryReq) Reset() {\n\t*x = CategoryReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_category_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CategoryReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CategoryReq) ProtoMessage() {}\n\nfunc (x *CategoryReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_category_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CategoryReq.ProtoReflect.Descriptor instead.\nfunc (*CategoryReq) Descriptor() ([]byte, []int) {\n\treturn file_category_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CategoryReq) GetCategory() string {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn \"\"\n}\n\nvar File_category_page_proto protoreflect.FileDescriptor\n\nvar file_category_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x08, 0x63, 0x61, 0x74,\n\t0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xd2, 0xbb, 0x18,\n\t0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x32, 0x6e, 0x0a, 0x0f, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52,\n\t0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13,\n\t0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2f, 0x3a, 0x63, 0x61, 0x74, 0x65, 0x67,\n\t0x6f, 0x72, 0x79, 0x42, 0x4f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d,\n\t0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67,\n\t0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_category_page_proto_rawDescOnce sync.Once\n\tfile_category_page_proto_rawDescData = file_category_page_proto_rawDesc\n)\n\nfunc file_category_page_proto_rawDescGZIP() []byte {\n\tfile_category_page_proto_rawDescOnce.Do(func() {\n\t\tfile_category_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_category_page_proto_rawDescData)\n\t})\n\treturn file_category_page_proto_rawDescData\n}\n\nvar file_category_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_category_page_proto_goTypes = []interface{}{\n\t(*CategoryReq)(nil),  // 0: frontend.category.CategoryReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_category_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.category.CategoryService.Category:input_type -> frontend.category.CategoryReq\n\t1, // 1: frontend.category.CategoryService.Category:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_category_page_proto_init() }\nfunc file_category_page_proto_init() {\n\tif File_category_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_category_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CategoryReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_category_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_category_page_proto_goTypes,\n\t\tDependencyIndexes: file_category_page_proto_depIdxs,\n\t\tMessageInfos:      file_category_page_proto_msgTypes,\n\t}.Build()\n\tFile_category_page_proto = out.File\n\tfile_category_page_proto_rawDesc = nil\n\tfile_category_page_proto_goTypes = nil\n\tfile_category_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/hertz_gen/frontend/checkout/checkout_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: checkout_page.proto\n\npackage checkout\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\" form:\"email\"`\n\tFirstname       string `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\" form:\"firstname\"`\n\tLastname        string `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\" form:\"lastname\"`\n\tStreet          string `protobuf:\"bytes,4,opt,name=street,proto3\" json:\"street,omitempty\" form:\"street\"`\n\tZipcode         string `protobuf:\"bytes,5,opt,name=zipcode,proto3\" json:\"zipcode,omitempty\" form:\"zipcode\"`\n\tProvince        string `protobuf:\"bytes,6,opt,name=province,proto3\" json:\"province,omitempty\" form:\"province\"`\n\tCountry         string `protobuf:\"bytes,7,opt,name=country,proto3\" json:\"country,omitempty\" form:\"country\"`\n\tCity            string `protobuf:\"bytes,8,opt,name=city,proto3\" json:\"city,omitempty\" form:\"city\"`\n\tCardNum         string `protobuf:\"bytes,9,opt,name=card_num,json=cardNum,proto3\" json:\"card_num,omitempty\" form:\"cardNum\"`\n\tExpirationMonth int32  `protobuf:\"varint,10,opt,name=expiration_month,json=expirationMonth,proto3\" json:\"expiration_month,omitempty\" form:\"expirationMonth\"`\n\tExpirationYear  int32  `protobuf:\"varint,11,opt,name=expiration_year,json=expirationYear,proto3\" json:\"expiration_year,omitempty\" form:\"expirationYear\"`\n\tCvv             int32  `protobuf:\"varint,12,opt,name=cvv,proto3\" json:\"cvv,omitempty\" form:\"cvv\"`\n\tPayment         string `protobuf:\"bytes,13,opt,name=payment,proto3\" json:\"payment,omitempty\" form:\"payment\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetStreet() string {\n\tif x != nil {\n\t\treturn x.Street\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetZipcode() string {\n\tif x != nil {\n\t\treturn x.Zipcode\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetProvince() string {\n\tif x != nil {\n\t\treturn x.Province\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetCardNum() string {\n\tif x != nil {\n\t\treturn x.CardNum\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationMonth\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.ExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetCvv() int32 {\n\tif x != nil {\n\t\treturn x.Cvv\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetPayment() string {\n\tif x != nil {\n\t\treturn x.Payment\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_page_proto protoreflect.FileDescriptor\n\nvar file_checkout_page_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa6, 0x04, 0x0a, 0x0b, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe2, 0xbb, 0x18, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d,\n\t0xe2, 0xbb, 0x18, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x09, 0x66,\n\t0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe2, 0xbb, 0x18, 0x08,\n\t0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x0a, 0xe2, 0xbb, 0x18, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x52, 0x06,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64,\n\t0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x7a, 0x69, 0x70,\n\t0x63, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a,\n\t0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0c, 0xe2, 0xbb, 0x18, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70,\n\t0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2, 0xbb, 0x18, 0x07, 0x63, 0x6f,\n\t0x75, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c,\n\t0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xe2, 0xbb,\n\t0x18, 0x04, 0x63, 0x69, 0x74, 0x79, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x08,\n\t0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b,\n\t0xe2, 0xbb, 0x18, 0x07, 0x63, 0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x52, 0x07, 0x63, 0x61, 0x72,\n\t0x64, 0x4e, 0x75, 0x6d, 0x12, 0x3e, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13,\n\t0xe2, 0xbb, 0x18, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f,\n\t0x6e, 0x74, 0x68, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x6f, 0x6e, 0x74, 0x68, 0x12, 0x3b, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, 0xe2,\n\t0xbb, 0x18, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61,\n\t0x72, 0x12, 0x19, 0x0a, 0x03, 0x63, 0x76, 0x76, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07,\n\t0xe2, 0xbb, 0x18, 0x03, 0x63, 0x76, 0x76, 0x52, 0x03, 0x63, 0x76, 0x76, 0x12, 0x25, 0x0a, 0x07,\n\t0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe2,\n\t0xbb, 0x18, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x32, 0x96, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x6f, 0x75, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0d, 0xca, 0xc1, 0x18,\n\t0x09, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x58, 0x0a, 0x0f, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e,\n\t0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,\n\t0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0xd2,\n\t0xc1, 0x18, 0x11, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x77, 0x61, 0x69,\n\t0x74, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0xca, 0xc1, 0x18, 0x10, 0x2f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x4f, 0x5a, 0x4d,\n\t0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64,\n\t0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f,\n\t0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_page_proto_rawDescOnce sync.Once\n\tfile_checkout_page_proto_rawDescData = file_checkout_page_proto_rawDesc\n)\n\nfunc file_checkout_page_proto_rawDescGZIP() []byte {\n\tfile_checkout_page_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_page_proto_rawDescData)\n\t})\n\treturn file_checkout_page_proto_rawDescData\n}\n\nvar file_checkout_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_checkout_page_proto_goTypes = []interface{}{\n\t(*CheckoutReq)(nil),  // 0: frontend.checkout.CheckoutReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_checkout_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.checkout.CheckoutService.Checkout:input_type -> frontend.checkout.CheckoutReq\n\t1, // 1: frontend.checkout.CheckoutService.CheckoutWaiting:input_type -> frontend.common.Empty\n\t1, // 2: frontend.checkout.CheckoutService.CheckoutResult:input_type -> frontend.common.Empty\n\t1, // 3: frontend.checkout.CheckoutService.Checkout:output_type -> frontend.common.Empty\n\t1, // 4: frontend.checkout.CheckoutService.CheckoutWaiting:output_type -> frontend.common.Empty\n\t1, // 5: frontend.checkout.CheckoutService.CheckoutResult:output_type -> frontend.common.Empty\n\t3, // [3:6] is the sub-list for method output_type\n\t0, // [0:3] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_page_proto_init() }\nfunc file_checkout_page_proto_init() {\n\tif File_checkout_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_page_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_page_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_page_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_page_proto = out.File\n\tfile_checkout_page_proto_rawDesc = nil\n\tfile_checkout_page_proto_goTypes = nil\n\tfile_checkout_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/hertz_gen/frontend/common/common.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: frontend/common.proto\n\npackage common\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Empty struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Empty) Reset() {\n\t*x = Empty{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_frontend_common_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Empty) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Empty) ProtoMessage() {}\n\nfunc (x *Empty) ProtoReflect() protoreflect.Message {\n\tmi := &file_frontend_common_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Empty.ProtoReflect.Descriptor instead.\nfunc (*Empty) Descriptor() ([]byte, []int) {\n\treturn file_frontend_common_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_frontend_common_proto protoreflect.FileDescriptor\n\nvar file_frontend_common_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_frontend_common_proto_rawDescOnce sync.Once\n\tfile_frontend_common_proto_rawDescData = file_frontend_common_proto_rawDesc\n)\n\nfunc file_frontend_common_proto_rawDescGZIP() []byte {\n\tfile_frontend_common_proto_rawDescOnce.Do(func() {\n\t\tfile_frontend_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_frontend_common_proto_rawDescData)\n\t})\n\treturn file_frontend_common_proto_rawDescData\n}\n\nvar file_frontend_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_frontend_common_proto_goTypes = []interface{}{\n\t(*Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_frontend_common_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_frontend_common_proto_init() }\nfunc file_frontend_common_proto_init() {\n\tif File_frontend_common_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_frontend_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Empty); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_frontend_common_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_frontend_common_proto_goTypes,\n\t\tDependencyIndexes: file_frontend_common_proto_depIdxs,\n\t\tMessageInfos:      file_frontend_common_proto_msgTypes,\n\t}.Build()\n\tFile_frontend_common_proto = out.File\n\tfile_frontend_common_proto_rawDesc = nil\n\tfile_frontend_common_proto_goTypes = nil\n\tfile_frontend_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/hertz_gen/frontend/home/home.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: home.proto\n\npackage home\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_home_proto protoreflect.FileDescriptor\n\nvar file_home_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x66, 0x72,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x09, 0x61,\n\t0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,\n\t0x4c, 0x0a, 0x0b, 0x48, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d,\n\t0x0a, 0x04, 0x48, 0x6f, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x05, 0xca, 0xc1, 0x18, 0x01, 0x2f, 0x42, 0x4b, 0x5a,\n\t0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar file_home_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_home_proto_depIdxs = []int32{\n\t0, // 0: frontend.common.HomeService.Home:input_type -> frontend.common.Empty\n\t0, // 1: frontend.common.HomeService.Home:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_home_proto_init() }\nfunc file_home_proto_init() {\n\tif File_home_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_home_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_home_proto_goTypes,\n\t\tDependencyIndexes: file_home_proto_depIdxs,\n\t}.Build()\n\tFile_home_proto = out.File\n\tfile_home_proto_rawDesc = nil\n\tfile_home_proto_goTypes = nil\n\tfile_home_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/hertz_gen/frontend/order/order_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: order_page.proto\n\npackage order\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_order_page_proto protoreflect.FileDescriptor\n\nvar file_order_page_proto_rawDesc = []byte{\n\t0x0a, 0x10, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x32, 0x57, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x73,\n\t0x74, 0x12, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x66, 0x72, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x0a, 0xca, 0xc1, 0x18, 0x06, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x4c, 0x5a,\n\t0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x66, 0x72, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar file_order_page_proto_goTypes = []interface{}{\n\t(*common.Empty)(nil), // 0: frontend.common.Empty\n}\nvar file_order_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.order.OrderService.OrderList:input_type -> frontend.common.Empty\n\t0, // 1: frontend.order.OrderService.OrderList:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_order_page_proto_init() }\nfunc file_order_page_proto_init() {\n\tif File_order_page_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_page_proto_goTypes,\n\t\tDependencyIndexes: file_order_page_proto_depIdxs,\n\t}.Build()\n\tFile_order_page_proto = out.File\n\tfile_order_page_proto_rawDesc = nil\n\tfile_order_page_proto_goTypes = nil\n\tfile_order_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/hertz_gen/frontend/product/product_page.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: product_page.proto\n\npackage product\n\nimport (\n\t_ \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/api\"\n\tcommon \"github.com/cloudwego/biz-demo/gomall/app/frontend/hertz_gen/frontend/common\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\" query:\"id\"`\n}\n\nfunc (x *ProductReq) Reset() {\n\t*x = ProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_page_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProductReq) ProtoMessage() {}\n\nfunc (x *ProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_page_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProductReq.ProtoReflect.Descriptor instead.\nfunc (*ProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_page_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nvar File_product_page_proto protoreflect.FileDescriptor\n\nvar file_product_page_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0x15, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,\n\t0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x61,\n\t0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x42, 0x06, 0xb2, 0xbb, 0x18, 0x02, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x32, 0x62,\n\t0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x50, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45,\n\t0x6d, 0x70, 0x74, 0x79, 0x22, 0x0c, 0xca, 0xc1, 0x18, 0x08, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64,\n\t0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x66,\n\t0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_page_proto_rawDescOnce sync.Once\n\tfile_product_page_proto_rawDescData = file_product_page_proto_rawDesc\n)\n\nfunc file_product_page_proto_rawDescGZIP() []byte {\n\tfile_product_page_proto_rawDescOnce.Do(func() {\n\t\tfile_product_page_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_page_proto_rawDescData)\n\t})\n\treturn file_product_page_proto_rawDescData\n}\n\nvar file_product_page_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_product_page_proto_goTypes = []interface{}{\n\t(*ProductReq)(nil),   // 0: frontend.product.ProductReq\n\t(*common.Empty)(nil), // 1: frontend.common.Empty\n}\nvar file_product_page_proto_depIdxs = []int32{\n\t0, // 0: frontend.product.ProductService.GetProduct:input_type -> frontend.product.ProductReq\n\t1, // 1: frontend.product.ProductService.GetProduct:output_type -> frontend.common.Empty\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_product_page_proto_init() }\nfunc file_product_page_proto_init() {\n\tif File_product_page_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_page_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_page_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_page_proto_goTypes,\n\t\tDependencyIndexes: file_product_page_proto_depIdxs,\n\t\tMessageInfos:      file_product_page_proto_msgTypes,\n\t}.Build()\n\tFile_product_page_proto = out.File\n\tfile_product_page_proto_rawDesc = nil\n\tfile_product_page_proto_goTypes = nil\n\tfile_product_page_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/infra/mtl/log.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/kitex/server\"\n\thertzzap \"github.com/hertz-contrib/logger/zap\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\"\n)\n\nfunc initLog() {\n\tvar opts []hertzzap.Option\n\tvar output zapcore.WriteSyncer\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\topts = append(opts, hertzzap.WithCoreEnc(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())))\n\t\toutput = os.Stdout\n\t} else {\n\t\topts = append(opts, hertzzap.WithCoreEnc(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())))\n\t\t// async log\n\t\toutput = &zapcore.BufferedWriteSyncer{\n\t\t\tWS:            zapcore.AddSync(os.Stdout),\n\t\t\tFlushInterval: time.Minute,\n\t\t}\n\t\tserver.RegisterShutdownHook(func() {\n\t\t\toutput.Sync() //nolint:errcheck\n\t\t})\n\t}\n\tlog := hertzzap.NewLogger(opts...)\n\thlog.SetLogger(log)\n\thlog.SetLevel(hlog.LevelInfo)\n\thlog.SetOutput(output)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/infra/mtl/metric.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\n\t\"github.com/cloudwego/hertz/pkg/app/server/registry\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/route\"\n\tconsulapi \"github.com/hashicorp/consul/api\"\n\t\"github.com/hertz-contrib/registry/consul\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/collectors\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n)\n\nvar Registry *prometheus.Registry\n\nfunc initMetric() route.CtxCallback {\n\tRegistry = prometheus.NewRegistry()\n\tRegistry.MustRegister(collectors.NewGoCollector())\n\tRegistry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))\n\tconfig := consulapi.DefaultConfig()\n\tconfig.Address = conf.GetConf().Hertz.RegistryAddr\n\tconsulClient, _ := consulapi.NewClient(config)\n\tr := consul.NewConsulRegister(consulClient, consul.WithAdditionInfo(&consul.AdditionInfo{\n\t\tTags: []string{\"service:frontend\"},\n\t}))\n\n\tlocalIp := utils.LocalIP()\n\tip, err := net.ResolveTCPAddr(\"tcp\", fmt.Sprintf(\"%s:%d\", localIp, conf.GetConf().Hertz.MetricsPort))\n\tif err != nil {\n\t\thlog.Error(err)\n\t}\n\tregistryInfo := &registry.Info{Addr: ip, ServiceName: \"prometheus\", Weight: 1}\n\terr = r.Register(registryInfo)\n\n\tif err != nil {\n\t\thlog.Error(err)\n\t}\n\n\thttp.Handle(\"/metrics\", promhttp.HandlerFor(Registry, promhttp.HandlerOpts{}))\n\tgo http.ListenAndServe(fmt.Sprintf(\":%d\", conf.GetConf().Hertz.MetricsPort), nil) //nolint:errcheck\n\treturn func(ctx context.Context) {\n\t\tr.Deregister(registryInfo) //nolint:errcheck\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/infra/mtl/mtl.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/hertz/pkg/route\"\n)\n\nvar once sync.Once\n\nvar Hooks []route.CtxCallback\n\nfunc InitMtl() {\n\tonce.Do(\n\t\tfunc() {\n\t\t\tHooks = append(Hooks, InitTracing(), initMetric())\n\t\t\tinitLog()\n\t\t},\n\t)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/infra/mtl/tracing.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/route\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.17.0\"\n)\n\nvar TracerProvider *tracesdk.TracerProvider\n\nfunc InitTracing() route.CtxCallback {\n\texporter, err := otlptracegrpc.New(context.Background())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tprocessor := tracesdk.NewBatchSpanProcessor(exporter)\n\tres, err := resource.New(context.Background(), resource.WithAttributes(semconv.ServiceNameKey.String(utils.ServiceName)))\n\tif err != nil {\n\t\tres = resource.Default()\n\t}\n\tTracerProvider = tracesdk.NewTracerProvider(tracesdk.WithSpanProcessor(processor), tracesdk.WithResource(res))\n\totel.SetTracerProvider(TracerProvider)\n\n\treturn route.CtxCallback(func(ctx context.Context) {\n\t\texporter.Shutdown(ctx) //nolint:errcheck\n\t})\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/infra/rpc/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/mtl\"\n\tfrontendutils \"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/clientsuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/circuitbreak\"\n\t\"github.com/cloudwego/kitex/pkg/fallback\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar (\n\tUserClient     userservice.Client\n\tProductClient  productcatalogservice.Client\n\tCartClient     cartservice.Client\n\tCheckoutClient checkoutservice.Client\n\tOrderClient    orderservice.Client\n\n\tonce sync.Once\n)\n\nfunc InitClient() {\n\tonce.Do(func() {\n\t\tinitUserClient()\n\t\tinitProductClient()\n\t\tinitCartClient()\n\t\tinitCheckoutClient()\n\t\tinitOrderClient()\n\t})\n}\n\nfunc initUserClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\tUserClient, err = userservice.NewClient(\"user\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initProductClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\tcbs := circuitbreak.NewCBSuite(func(ri rpcinfo.RPCInfo) string {\n\t\treturn circuitbreak.RPCInfo2Key(ri)\n\t})\n\n\tcbs.UpdateServiceCBConfig(\"shop-frontend/product/GetProduct\", circuitbreak.CBConfig{Enable: true, ErrRate: 0.5, MinSample: 2})\n\n\topts = append(opts, client.WithCircuitBreaker(cbs), client.WithFallback(fallback.NewFallbackPolicy(fallback.UnwrapHelper(func(ctx context.Context, req, resp interface{}, err error) (fbResp interface{}, fbErr error) {\n\t\tmethodName := rpcinfo.GetRPCInfo(ctx).To().Method()\n\t\tif err == nil {\n\t\t\treturn resp, err\n\t\t}\n\t\tif methodName != \"ListProducts\" {\n\t\t\treturn resp, err\n\t\t}\n\t\treturn &product.ListProductsResp{\n\t\t\tProducts: []*product.Product{\n\t\t\t\t{\n\t\t\t\t\tPrice:       6.6,\n\t\t\t\t\tId:          3,\n\t\t\t\t\tPicture:     \"/static/image/t-shirt.jpeg\",\n\t\t\t\t\tName:        \"T-Shirt\",\n\t\t\t\t\tDescription: \"CloudWeGo T-Shirt\",\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil\n\t}))))\n\tProductClient, err = productcatalogservice.NewClient(\"product\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCartClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(os.Getenv(\"REGISTRY_ADDR\"))\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t)\n\n\tCartClient, err = cartservice.NewClient(\"cart\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initCheckoutClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t)\n\tCheckoutClient, err = checkoutservice.NewClient(\"checkout\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n\nfunc initOrderClient() {\n\tvar opts []client.Option\n\tr, err := consul.NewConsulResolver(conf.GetConf().Hertz.RegistryAddr)\n\tfrontendutils.MustHandleError(err)\n\topts = append(opts, client.WithResolver(r), client.WithSuite(clientsuite.CommonGrpcClientSuite{\n\t\tCurrentServiceName: frontendutils.ServiceName,\n\t\tTracerProvider:     mtl.TracerProvider,\n\t}))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: frontendutils.ServiceName}),\n\t)\n\tOrderClient, err = orderservice.NewClient(\"order\", opts...)\n\tfrontendutils.MustHandleError(err)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by hertz generator.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/biz/router\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/infra/rpc\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/middlewares/server/recovery\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n\t\"github.com/hertz-contrib/cors\"\n\t\"github.com/hertz-contrib/gzip\"\n\t\"github.com/hertz-contrib/logger/accesslog\"\n\thertzprom \"github.com/hertz-contrib/monitor-prometheus\"\n\thertzotelprovider \"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\thertzoteltracing \"github.com/hertz-contrib/obs-opentelemetry/tracing\"\n\t\"github.com/hertz-contrib/pprof\"\n\t\"github.com/hertz-contrib/sessions\"\n\t\"github.com/hertz-contrib/sessions/redis\"\n\t\"github.com/joho/godotenv\"\n\toteltrace \"go.opentelemetry.io/otel/trace\"\n)\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMtl()\n\trpc.InitClient()\n\n\taddress := conf.GetConf().Hertz.Address\n\n\t_ = hertzotelprovider.NewOpenTelemetryProvider(\n\t\thertzotelprovider.WithSdkTracerProvider(mtl.TracerProvider),\n\t\thertzotelprovider.WithEnableMetrics(false),\n\t)\n\n\ttracer, cfg := hertzoteltracing.NewServerTracer(hertzoteltracing.WithCustomResponseHandler(func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Header(\"shop-trace-id\", oteltrace.SpanFromContext(ctx).SpanContext().TraceID().String())\n\t}))\n\n\th := server.New(server.WithHostPorts(address), server.WithTracer(hertzprom.NewServerTracer(\n\t\t\"\",\n\t\t\"\",\n\t\thertzprom.WithRegistry(mtl.Registry),\n\t\thertzprom.WithDisableServer(true),\n\t)), tracer)\n\th.LoadHTMLGlob(\"template/*\")\n\th.Delims(\"{{\", \"}}\")\n\th.Use(hertzoteltracing.ServerMiddleware(cfg))\n\n\tregisterMiddleware(h)\n\n\trouter.GeneratedRegister(h)\n\n\th.GET(\"sign-in\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-in\", utils.H{\n\t\t\t\"title\": \"Sign in\",\n\t\t\t\"next\":  c.Query(\"next\"),\n\t\t})\n\t})\n\th.GET(\"sign-up\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.HTML(consts.StatusOK, \"sign-up\", utils.H{\n\t\t\t\"title\": \"Sign up\",\n\t\t})\n\t})\n\n\th.Static(\"/static\", \"./\")\n\n\th.Spin()\n}\n\nfunc registerMiddleware(h *server.Hertz) {\n\t// pprof\n\tif conf.GetConf().Hertz.EnablePprof {\n\t\tpprof.Register(h)\n\t}\n\tstore, err := redis.NewStore(100, \"tcp\", conf.GetConf().Redis.Address, \"\", []byte(os.Getenv(\"SESSION_SECRET\")))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tstore.Options(sessions.Options{MaxAge: 86400, Path: \"/\"})\n\trs, err := redis.GetRedisStore(store)\n\tif err == nil {\n\t\trs.SetSerializer(sessions.JSONSerializer{})\n\t}\n\th.Use(sessions.New(\"cloudwego-shop\", store))\n\t// gzip\n\tif conf.GetConf().Hertz.EnableGzip {\n\t\th.Use(gzip.Gzip(gzip.DefaultCompression))\n\t}\n\n\t// access log\n\tif conf.GetConf().Hertz.EnableAccessLog {\n\t\th.Use(accesslog.New())\n\t}\n\n\t// recovery\n\th.Use(recovery.Recovery())\n\n\th.OnShutdown = append(h.OnShutdown, mtl.Hooks...)\n\n\t// cores\n\th.Use(cors.Default())\n\tmiddleware.RegisterMiddleware(h)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/middleware/auth.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/frontend/utils\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/hertz-contrib/sessions\"\n)\n\nfunc GlobalAuth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n\nfunc Auth() app.HandlerFunc {\n\treturn func(ctx context.Context, c *app.RequestContext) {\n\t\tsession := sessions.Default(c)\n\t\tuserId := session.Get(\"user_id\")\n\t\tif userId == nil {\n\t\t\tbyteRef := c.GetHeader(\"Referer\")\n\t\t\tref := string(byteRef)\n\t\t\tnext := \"/sign-in\"\n\t\t\tif ref != \"\" {\n\t\t\t\tif utils.ValidateNext(ref) {\n\t\t\t\t\tnext = fmt.Sprintf(\"%s?next=%s\", next, ref)\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.Redirect(302, []byte(next))\n\t\t\tc.Abort()\n\t\t\tc.Next(ctx)\n\t\t\treturn\n\t\t}\n\t\tctx = context.WithValue(ctx, utils.UserIdKey, userId)\n\t\tc.Next(ctx)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/middleware/middleware.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport \"github.com/cloudwego/hertz/pkg/app/server\"\n\nfunc RegisterMiddleware(h *server.Hertz) {\n\th.Use(GlobalAuth())\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Hertz](https://github.com/cloudwego/hertz/) framework\n- Integration of pprof, cors, recovery, access_log, gzip and other extensions of Hertz.\n- Generating the base code for unit tests.\n- Provides basic profile functions.\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| hertz_gen  | Hertz generated model |\n| biz/handler  | Used for request processing, validation and return of response. |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n| biz/route  | Routing and middleware registration |\n| biz/utils  | Wrapped some common methods |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/script/bootstrap.sh",
    "content": "#!/bin/bash\nCURDIR=$(cd $(dirname $0); pwd)\nBinaryName=frontend\necho \"$CURDIR/bin/${BinaryName}\"\nexec $CURDIR/bin/${BinaryName}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/cart-num.tmpl",
    "content": "{{define \"cart-num\"}}\n    <a href=\"/cart\" class=\"btn position-relative\">\n        <i class=\"fa-solid fa-cart-shopping\" style=\"font-size: 2rem\">\n        </i>\n        {{ if $.cart_num}}\n        <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\">\n    {{ $.cart_num }}\n            {{ end }}\n  </span>\n    </a>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/cart.tmpl",
    "content": "{{ define \"cart\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <ul class=\"list-group\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n        {{ if $.items }}\n            <div class=\"mt-3 mb-5\">\n                <div class=\"float-end\">\n                    <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                    <a href=\"/checkout\" class=\"btn btn-lg btn-success float-end\">Check out</a>\n                </div>\n            </div>\n        {{else}}\n            <h1 class=\"text-center text-danger\">Your Cart is empty</h1>\n            <div class=\"text-center\"><a href=\"/\">Shop Hot Sale</a></div>\n        {{ end }}\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/category.tmpl",
    "content": "{{ define \"category\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/checkout.tmpl",
    "content": "{{ define \"checkout\" }}\n    {{ template \"header\" . }}\n    <div class=\"row mb-5\">\n        <div class=\"col-lg-8 col-sm-12\">\n            <form method=\"post\" action=\"/checkout/waiting\">\n                <h4 class=\"mb-3 mt-3\">Contact</h4>\n                <label for=\"email\" class=\"form-label col-12\">\n                    <input class=\"form-control\" id=\"email\" type=\"email\" placeholder=\"Email\" name=\"email\"\n                           aria-label=\"email\" value=\"abc@example.com\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">Delivery</h4>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"firstname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"firstname\" class=\"form-control\" placeholder=\"First name\"\n                               name=\"firstname\" value=\"world\">\n                    </label>\n                    <label for=\"lastname\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"lastname\" class=\"form-control\" placeholder=\"Last name\" name=\"lastname\"\n                               value=\"hello\">\n                    </label>\n                </div>\n                <label for=\"street\" class=\"mb-3 mt-3 col-12 form-label\">\n                    <input type=\"text\" class=\"form-control\" placeholder=\"Street\" name=\"street\" value=\"7th street\"\n                           id=\"street\">\n                </label>\n                <label for=\"zipcode\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"zipcode\" name=\"zipcode\" placeholder=\"zipcode\"\n                           value=\"310000\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"city\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"city\" class=\"form-control\" placeholder=\"City\" name=\"city\"\n                               value=\"hangzhou\">\n                    </label>\n                    <label for=\"province\" class=\"col-md-6 col-sm-12\">\n                        <input type=\"text\" id=\"province\" class=\"form-control\" name=\"province\" placeholder=\"Province\"\n                               value=\"zhejiang\">\n                    </label>\n                </div>\n                <label for=\"country\" class=\"mb-3 mt-3 form-label col-12\">\n                    <input type=\"text\" class=\"form-control\" id=\"country\" name=\"country\" placeholder=\"Country\"\n                           value=\"china\">\n                </label>\n                <h4 class=\"mb-3 mt-3\">\n                    Payment\n                </h4>\n                <label for=\"card-num\" class=\"form-label col-12\">\n                    <input type=\"text\" id=\"card-num\" class=\"form-control\" name=\"cardNum\" placeholder=\"Card number\"\n                           value=\"424242424242424242\">\n                </label>\n                <div class=\"mb-3 mt-3 col-12 row\">\n                    <label for=\"expiration-month\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-month\" name=\"expirationMonth\" class=\"form-control\"\n                               placeholder=\"Expiration Month\" value=\"12\">\n                    </label>\n                    <label for=\"expiration-year\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"expiration-year\" name=\"expirationYear\" class=\"form-control\"\n                               placeholder=\"Expiration Year\" value=\"2030\">\n                    </label>\n                    <label for=\"cvv\" class=\"col-md-4 col-sm-12\">\n                        <input type=\"text\" id=\"cvv\" class=\"form-control\" name=\"cvv\" placeholder=\"cvv\" required>\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"card\" value=\"card\" checked>\n                    <label class=\"form-check-label\" for=\"card\">\n                        Card\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"stripe\" value=\"stripe\" disabled>\n                    <label class=\"form-check-label\" for=\"stripe\">\n                        Stripe\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"paypal\" value=\"paypal\" disabled>\n                    <label class=\"form-check-label\" for=\"paypal\">\n                        Paypal\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"wechat\" value=\"wechat\" disabled>\n                    <label class=\"form-check-label\" for=\"wechat\">\n                        Wechat\n                    </label>\n                </div>\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"radio\" name=\"payment\" id=\"alipay\" value=\"alipay\" disabled>\n                    <label class=\"form-check-label\" for=\"alipay\">\n                        Alipay\n                    </label>\n                </div>\n                <div class=\"mt-3 mb-3\">\n                    <div class=\"float-end\">\n                        <div class=\"m-3 text-danger\">Total: ${{ .total }}</div>\n                        <input type=\"submit\" class=\"btn btn-success\" value=\"Pay\">\n                    </div>\n                </div>\n            </form>\n        </div>\n        <ul class=\"list-group col-lg-4 col-sm-12\">\n            {{ range $.items }}\n                <li class=\"list-group-item\">\n                    <div class=\"card border-0\">\n                        <div class=\"card-body row\">\n                            <div class=\"col-4\">\n                                <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                            </div>\n                            <div class=\"col-8\">\n                                <div class=\"mt-1\">{{ .Name }}</div>\n                                <div class=\"mt-1\">Single Price: ${{ .Price }}</div>\n                                <div class=\"mt-1\">Qty: {{ .Qty }}</div>\n                            </div>\n                        </div>\n                    </div>\n                </li>\n            {{ end}}\n        </ul>\n    </div>\n    {{ template \"footer\" . }}\n\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/footer.tmpl",
    "content": "{{ define \"footer\" }}\n\n    </div>\n    </main>\n    <footer class=\"py-5 bg-primary text-white\">\n        <div class=\"footer-top\">\n            <div class=\"container footer-social\">\n                <p>© 2023 CloudWeGo (<a class=\"text-white\"\n                                        href=\"https://github.com/cloudwego\">Source Code</a>)</p>\n            </div>\n        </div>\n    </footer>\n    <script src=\"/static/js/bootstrap.bundle.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/js/all.min.js\"\n            integrity=\"sha512-GWzVrcGlo0TxTRvz9ttioyYJ+Wwk9Ck0G81D+eO63BaqHaJ3YZX9wuqjwgfcV/MrB2PhaVX9DkYVhbFpStnqpQ==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    </body>\n    </html>\n{{ end }}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/header.tmpl",
    "content": "{{ define \"header\" }}\n    <!DOCTYPE html>\n    <html lang=\"en\">\n\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, shrink-to-fit=no\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n        {{ if $.redirect }}\n            <meta http-equiv=\"refresh\" content=\"5;url=/checkout/result\"/>\n        {{ end}}\n        <title>\n            CloudWeGo Shop\n        </title>\n        <link rel=\"stylesheet\" href=\"/static/css/bootstrap.min.css\">\n        <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css\"\n              integrity=\"sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==\"\n              crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n    </head>\n\n    <body class=\"min-vh-100\">\n    <header>\n        <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n            <div class=\"container\">\n                <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\"\n                        data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"/\">\n                    <img src=\"/static/image/logo.jpg\" style=\"height: 50px\" alt=\"\"> CloudWego Shop\n                </a>\n                <div class=\" ms-lg-3 d-block d-lg-none d-xl-none\">\n                    {{ template \"cart-num\" . }}\n                </div>\n                <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                    <ul class=\"navbar-nav mb-2 mb-lg-0 w-100\">\n                        <li class=\"nav-item dropdown\">\n                            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\"\n                               aria-expanded=\"false\">\n                                Categories\n                            </a>\n                            <ul class=\"dropdown-menu\">\n                                <li><a class=\"dropdown-item\" href=\"/category/t-shirt\">T-shirt</a></li>\n                                <li><a class=\"dropdown-item\" href=\"/category/sticker\">Sticker</a></li>\n                            </ul>\n                        </li>\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link\" href=\"/about\">About</a>\n                        </li>\n                        <form class=\"d-flex ms-auto\" role=\"search\" action=\"/search\" method=\"get\">\n                            <input class=\"form-control me-2\" type=\"search\" name=\"q\" placeholder=\"Search\"\n                                   aria-label=\"Search\" value=\"{{ .q }}\">\n                            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n                        </form>\n                        {{ if .user_id }}\n                            <div class=\"nav-item dropdown ms-3\">\n                                <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\"\n                                   aria-expanded=\"false\"><i class=\"fa-solid fa-user me-2\"></i>Hello</a>\n                                <ul class=\"dropdown-menu\">\n                                    <li><a class=\"dropdown-item\" href=\"/order\">Order Center</a></li>\n                                    <li>\n                                        <hr class=\"dropdown-divider\">\n                                    </li>\n                                    <li>\n                                        <form class=\"d-flex ms-auto\" action=\"/auth/logout\" method=\"post\">\n                                        <button class=\"dropdown-item\" type=\"submit\">Logout</button>\n                                        </form>\n                                    </li>\n                                </ul>\n                            </div>\n                        {{ else }}\n                            <div class=\"btn-group ms-3\" role=\"group\" aria-label=\"Basic mixed styles example\">\n                                <a href=\"/sign-in\" class=\"btn btn-primary\">Sign in</a>\n                            </div>\n                        {{ end }}\n                    </ul>\n                </div>\n                <div class=\"ms-lg-3 d-none d-lg-block d-xl-block\">\n                    {{ template \"cart-num\" . }}\n                </div>\n\n            </div>\n        </nav>\n        <div class=\"bg-primary text-center text-white pt-1 pb-1\">This website is hosted for demo purposes only. It is\n            not an\n            actual shop.\n        </div>\n        {{ if .error }}\n            <div class=\"alert alert-danger text-center\" role=\"alert\">{{ .error }}</div>\n         {{ end }}\n        {{ if .warning }}\n            <div class=\"alert alert-warning text-center\" role=\"alert\">{{ .warning }}</div>\n        {{ end }}\n    </header>\n    <main role=\"main\" class=\"home pt-5\" style=\"min-height:calc(100vh - 212px);\">\n        <div class=\"container\">\n            <h1 class=\"text-center\">{{ $.title }}</h1>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/home.tmpl",
    "content": "{{ define \"home\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        {{ range $.items }}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/order.tmpl",
    "content": "{{ define \"order\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n                    <div class=\"card-body row\">\n                        {{ range $.orders }}\n                        <div class=\"card\">\n                            <div class=\"card-body\">\n                              <h6 class=\"card-subtitle mb-2 text-muted\">{{.CreatedDate}} Order ID: {{.OrderId}}</h6>\n                              <ul class=\"list-group col-lg-12 col-sm-15\">\n                                {{ range .Items }}\n                                    <li class=\"list-group-item border-0\">\n                                        <div class=\"card border-0\">\n                                            <div class=\"card-body row\">\n                                                <div class=\"col-3\">\n                                                    <img src=\"{{ .Picture }}\" style=\"max-width: 100px;max-height: 50px\" alt=\"\">\n                                                </div>\n                                                <div class=\"col-3\">\n                                                    <div class=\"mt-1\">{{ .ProductName }}</div>\n                                                </div>\n                                                <div class=\"col-2\">\n                                                    <div class=\"mt-1\">x {{ .Qty }}</div>\n                                                </div>\n                                                <div class=\"col-4\">\n                                                    <div class=\"mt-1\">Cost: {{ .Cost }}</div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </li>\n                                {{ end}}\n                            </ul>\n                            </div>\n                        </div>\n                        <p>\n                        {{ end}}\n                    </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/product.tmpl",
    "content": "{{ define \"product\" }}\n    {{ template \"header\" . }}\n    <div class=\"row\">\n        <div class=\"card border-0\" style=\"width: 100%;\">\n            <div class=\"card-body row\">\n                <div id=\"productPicture\" class=\"carousel slide col-lg-6 col-sm-12\">\n                    <div class=\"carousel-indicators\">\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"0\"\n                                class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"1\"\n                                aria-label=\"Slide 2\"></button>\n                        <button type=\"button\" data-bs-target=\"#productPicture\" data-bs-slide-to=\"2\"\n                                aria-label=\"Slide 3\"></button>\n                    </div>\n                    <div class=\"carousel-inner\">\n                        <div class=\"carousel-item active\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                        <div class=\"carousel-item\">\n                            <img src=\"{{ .item.Picture }}\" class=\"d-block w-100\" alt=\"...\">\n                        </div>\n                    </div>\n                    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"prev\">\n                        <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Previous</span>\n                    </button>\n                    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#productPicture\"\n                            data-bs-slide=\"next\">\n                        <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n                        <span class=\"visually-hidden\">Next</span>\n                    </button>\n                </div>\n                <div class=\"col-lg-1\"></div>\n                <div class=\"col-lg-5 col-sm-12 flex-column align-self-center\">\n                    <form action=\"/cart\" method=\"post\">\n                        <h5 class=\"card-title\">{{ .item.Name }}</h5>\n                        <p class=\"card-text\">{{ .item.Description }}</p>\n                        <p class=\"card-text\">${{ .item.Price }}</p>\n                        <input type=\"hidden\" value=\"{{ .item.Id }}\" name=\"productId\">\n                        <label for=\"productNum\">数量：</label>\n                        <input type=\"number\" class=\"form-control mt-3\" id=\"productNum\" name=\"productNum\" value=\"1\"\n                               min=\"1\"/>\n                        <input type=\"submit\" class=\"btn btn-primary mt-3\" value=\"Add to Cart\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/result.tmpl",
    "content": "{{ define \"result\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <i class=\"fa-regular fa-circle-check fs-1 text-success\"></i>\n        <div class=\"text-center fs-3\">\n            Congratulations, you have successfully placed an order.\n        </div>\n    </div>\n    <div class=\"d-flex justify-content-center\">\n        <a href=\"/order\" class=\"btn btn-info\">Check Order</a>\n        <a href=\"/\" class=\"btn btn-success ms-5\">Back to Home</a>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/search.tmpl",
    "content": "{{ define \"search\" }}\n    {{ template \"header\" . }}\n    {{ if .q }}\n        <div class=\"d-inline-block border border-success rounded-4 p-1 ps-4 pe-4\">\n            <div>\n                {{ .q }}\n                <a href=\"/category\" class=\"ps-4\">\n                    <button type=\"button\" class=\"btn btn-sm btn-danger\" aria-label=\"Close\">X</button>\n                </a>\n            </div>\n        </div>\n    {{ end}}\n    <div class=\"row\">\n        {{ range $.items}}\n            <div class=\"card border-0 col-lg-4 col-md-6 col-sm-12 p-1\">\n                <a href=\"/product?id={{ .Id }}\" class=\"btn\">\n                    <div class=\"card-body row\">\n                        <img src=\"{{ .Picture }}\" class=\"col-lg-6 col-sm-12\" alt=\"...\"\n                             style=\"max-height: 100%; min-height: 100%;\">\n                        <div class=\"col-lg-6 col-sm-12 flex-column align-self-end\">\n                            <div class=\"m-2\">\n                                {{ .Name }}\n                            </div>\n                            <div class=\"m-1\">${{ .Price }}</div>\n                        </div>\n                    </div>\n                </a>\n            </div>\n        {{ end}}\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/sign-in.tmpl",
    "content": "{{ define \"sign-in\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/login{{ if .next }}?next={{.next}} {{ end}}\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" required>\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\" required>\n            </div>\n            <div class=\"mb-3\">\n                Don't have account, click here to <a href=\"/sign-up\">Sign up</a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign in</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/sign-up.tmpl",
    "content": "{{ define \"sign-up\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5\">\n        <div class=\"col-3\"></div>\n        <form method=\"post\" class=\"col-6\" action=\"/auth/register\">\n            <div class=\"mb-3\">\n                <label for=\"email\" class=\"form-label\">Email {{template \"required\"}}</label>\n                <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" aria-describedby=\"emailHelp\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password\" class=\"form-label\">Password {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\">\n            </div>\n            <div class=\"mb-3\">\n                <label for=\"password-confirm\" class=\"form-label\">Password confirm {{template \"required\"}}</label>\n                <input type=\"password\" class=\"form-control\" id=\"password-confirm\" name=\"password-confirm\">\n            </div>\n            <div class=\"mb-3\">\n                Already have account, click here to <a href=\"/sign-in\">Sign in</a>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-primary\">Sign up</button>\n            </div>\n        </form>\n        <div class=\"col-3\"></div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/utils.tmpl",
    "content": "{{ define \"required\" }}\n    <span class=\"text-danger\">*</span>\n{{end}}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/template/waiting.tmpl",
    "content": "{{ define \"waiting\" }}\n    {{ template \"header\" . }}\n    <div class=\"container row p-5 d-flex justify-content-center\">\n        <div class=\"text-danger h3 text-center mb-5\">\n            Wait a minutes, please don't close the window\n        </div>\n        <div class=\"spinner-grow text-primary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-secondary\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-success\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-danger\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-warning\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-info\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-light\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        <div class=\"spinner-grow text-dark\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n    </div>\n    {{ template \"footer\" . }}\n{{ end }}"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/types/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage types\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype Order struct {\n\tConsignee   Consignee\n\tOrderId     string\n\tCreatedDate string\n\tOrderState  string\n\tCost        float32\n\tItems       []OrderItem\n}\n\ntype OrderItem struct {\n\tProductId   uint32\n\tProductName string\n\tPicture     string\n\tQty         uint32\n\tCost        float32\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"frontend\"\n\ntype SessionUserIdKey string\n\nconst UserIdKey = SessionUserIdKey(\"user_id\")\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/hertz/pkg/common/hlog\"\n\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\thlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/utils/function.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"context\"\n\nfunc GetUserIdFromCtx(ctx context.Context) uint32 {\n\tif ctx.Value(UserIdKey) == nil {\n\t\treturn 0\n\t}\n\treturn uint32(ctx.Value(UserIdKey).(float64))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/utils/response.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/utils/safe.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"net/url\"\n\nvar validHost = []string{\n\t\"localhost:8080\",\n}\n\nfunc ValidateNext(next string) bool {\n\turlObj, err := url.Parse(next)\n\tif err != nil {\n\t\treturn false\n\t}\n\tif InArray(urlObj.Host, validHost) {\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/frontend/utils/strings.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nfunc InArray[T int | int32 | int64 | float32 | float64 | string](needle T, haystack []T) bool {\n\tfor _, k := range haystack {\n\t\tif needle == k {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Order{},\n\t\t\t&model.OrderItem{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/model/order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Consignee struct {\n\tEmail string\n\n\tStreetAddress string\n\tCity          string\n\tState         string\n\tCountry       string\n\tZipCode       int32\n}\n\ntype Order struct {\n\tBase\n\tOrderId      string `gorm:\"uniqueIndex;size:256\"`\n\tUserId       uint32\n\tUserCurrency string\n\tConsignee    Consignee   `gorm:\"embedded\"`\n\tOrderItems   []OrderItem `gorm:\"foreignKey:OrderIdRefer;references:OrderId\"`\n}\n\nfunc (o Order) TableName() string {\n\treturn \"order\"\n}\n\nfunc ListOrder(db *gorm.DB, ctx context.Context, userId uint32) (orders []Order, err error) {\n\terr = db.Debug().Model(&Order{}).Where(&Order{UserId: userId}).Preload(\"OrderItems\").Find(&orders).Error\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/model/order_item.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\ntype OrderItem struct {\n\tBase\n\tProductId    uint32\n\tOrderIdRefer string `gorm:\"size:256;index\"`\n\tQuantity     int32\n\tCost         float32\n}\n\nfunc (oi OrderItem) TableName() string {\n\treturn \"order_item\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/service/list_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\ntype ListOrderService struct {\n\tctx context.Context\n} // NewListOrderService new ListOrderService\nfunc NewListOrderService(ctx context.Context) *ListOrderService {\n\treturn &ListOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListOrderService) Run(req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\t// Finish your business logic.\n\torders, err := model.ListOrder(mysql.DB, s.ctx, req.UserId)\n\tif err != nil {\n\t\tklog.Errorf(\"model.ListOrder.err:%v\", err)\n\t\treturn nil, err\n\t}\n\tvar list []*order.Order\n\tfor _, v := range orders {\n\t\tvar items []*order.OrderItem\n\t\tfor _, v := range v.OrderItems {\n\t\t\titems = append(items, &order.OrderItem{\n\t\t\t\tCost: v.Cost,\n\t\t\t\tItem: &cart.CartItem{\n\t\t\t\t\tProductId: v.ProductId,\n\t\t\t\t\tQuantity:  v.Quantity,\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\to := &order.Order{\n\t\t\tOrderId:      v.OrderId,\n\t\t\tUserId:       v.UserId,\n\t\t\tUserCurrency: v.UserCurrency,\n\t\t\tEmail:        v.Consignee.Email,\n\t\t\tCreatedAt:    int32(v.CreatedAt.Unix()),\n\t\t\tAddress: &order.Address{\n\t\t\t\tCountry:       v.Consignee.Country,\n\t\t\t\tCity:          v.Consignee.City,\n\t\t\t\tStreetAddress: v.Consignee.StreetAddress,\n\t\t\t\tZipCode:       v.Consignee.ZipCode,\n\t\t\t},\n\t\t\tOrderItems: items,\n\t\t}\n\t\tlist = append(list, o)\n\t}\n\tresp = &order.ListOrderResp{\n\t\tOrders: list,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/service/list_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/service/place_order.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/model\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype PlaceOrderService struct {\n\tctx context.Context\n} // NewPlaceOrderService new PlaceOrderService\nfunc NewPlaceOrderService(ctx context.Context) *PlaceOrderService {\n\treturn &PlaceOrderService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *PlaceOrderService) Run(req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\t// Finish your business logic.\n\tif len(req.OrderItems) == 0 {\n\t\terr = fmt.Errorf(\"OrderItems empty\")\n\t\treturn\n\t}\n\n\terr = mysql.DB.Transaction(func(tx *gorm.DB) error {\n\t\torderId, _ := uuid.NewUUID()\n\n\t\to := &model.Order{\n\t\t\tOrderId:      orderId.String(),\n\t\t\tUserId:       req.UserId,\n\t\t\tUserCurrency: req.UserCurrency,\n\t\t\tConsignee: model.Consignee{\n\t\t\t\tEmail: req.Email,\n\t\t\t},\n\t\t}\n\t\tif req.Address != nil {\n\t\t\ta := req.Address\n\t\t\to.Consignee.Country = a.Country\n\t\t\to.Consignee.State = a.State\n\t\t\to.Consignee.City = a.City\n\t\t\to.Consignee.StreetAddress = a.StreetAddress\n\t\t}\n\t\tif err := tx.Create(o).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvar itemList []*model.OrderItem\n\t\tfor _, v := range req.OrderItems {\n\t\t\titemList = append(itemList, &model.OrderItem{\n\t\t\t\tOrderIdRefer: o.OrderId,\n\t\t\t\tProductId:    v.Item.ProductId,\n\t\t\t\tQuantity:     v.Item.Quantity,\n\t\t\t\tCost:         v.Cost,\n\t\t\t})\n\t\t}\n\t\tif err := tx.Create(&itemList).Error; err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp = &order.PlaceOrderResp{\n\t\t\tOrder: &order.OrderResult{\n\t\t\t\tOrderId: orderId.String(),\n\t\t\t},\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/biz/service/place_order_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestPlaceOrder_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"order\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"order\"\n  address: \":8885\"\n  metrics_port: \":9995\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/order?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/order\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/service\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n)\n\n// OrderServiceImpl implements the last service interface defined in the IDL.\ntype OrderServiceImpl struct{}\n\n// PlaceOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) PlaceOrder(ctx context.Context, req *order.PlaceOrderReq) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = service.NewPlaceOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// ListOrder implements the OrderServiceImpl interface.\nfunc (s *OrderServiceImpl) ListOrder(ctx context.Context, req *order.ListOrderReq) (resp *order.ListOrderResp, err error) {\n\tresp, err = service.NewListOrderService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'order'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/order/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := orderservice.NewServer(new(OrderServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/order/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/order\"\nexec \"$CURDIR/bin/order\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\ntmp\n\n.env\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.PaymentLog{},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/biz/model/payment.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype PaymentLog struct {\n\tBase\n\tUserId        uint32    `json:\"user_id\"`\n\tOrderId       string    `json:\"order_id\"`\n\tTransactionId string    `json:\"transaction_id\"`\n\tAmount        float32   `json:\"amount\"`\n\tPayAt         time.Time `json:\"pay_at\"`\n}\n\nfunc (p PaymentLog) TableName() string {\n\treturn \"payment\"\n}\n\nfunc CreatePaymentLog(db *gorm.DB, ctx context.Context, payment *PaymentLog) error {\n\treturn db.WithContext(ctx).Model(&PaymentLog{}).Create(payment).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/biz/service/charge.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/model\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\tcreditcard \"github.com/durango/go-credit-card\"\n\t\"github.com/google/uuid\"\n)\n\ntype ChargeService struct {\n\tctx context.Context\n} // NewChargeService new ChargeService\nfunc NewChargeService(ctx context.Context) *ChargeService {\n\treturn &ChargeService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ChargeService) Run(req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tcard := creditcard.Card{\n\t\tNumber: req.CreditCard.CreditCardNumber,\n\t\tCvv:    strconv.Itoa(int(req.CreditCard.CreditCardCvv)),\n\t\tMonth:  strconv.Itoa(int(req.CreditCard.CreditCardExpirationMonth)),\n\t\tYear:   strconv.Itoa(int(req.CreditCard.CreditCardExpirationYear)),\n\t}\n\n\terr = card.Validate(true)\n\n\tif err != nil {\n\t\treturn nil, kerrors.NewBizStatusError(400, err.Error())\n\t}\n\n\ttranslationId, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = model.CreatePaymentLog(mysql.DB, s.ctx, &model.PaymentLog{\n\t\tUserId:        req.UserId,\n\t\tOrderId:       req.OrderId,\n\t\tTransactionId: translationId.String(),\n\t\tAmount:        req.Amount,\n\t\tPayAt:         time.Now(),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &payment.ChargeResp{TransactionId: translationId.String()}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/biz/service/charge_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestCharge_Run(t *testing.T) {\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"payment\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"payment\"\n  address: \":8886\"\n  metrics_port: \":9996\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/payment?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/payment\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082 h1:3RgcPZrUWhrxqhtDkuRmDTRVXGkxrVMZtJMic7cEtGA=\ngithub.com/durango/go-credit-card v0.0.0-20220404131259-a9e175ba4082/go.mod h1:jKPLGXGRR3v90kZOLs/kUMffoEot8IrRDGmmzI3kOtg=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/service\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n)\n\n// PaymentServiceImpl implements the last service interface defined in the IDL.\ntype PaymentServiceImpl struct{}\n\n// Charge implements the PaymentServiceImpl interface.\nfunc (s *PaymentServiceImpl) Charge(ctx context.Context, req *payment.ChargeReq) (resp *payment.ChargeResp, err error) {\n\tresp, err = service.NewChargeService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'payment'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/payment/middleware\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := paymentservice.NewServer(new(PaymentServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMiddleware(middleware.ServerMiddleware),\n\t)\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/middleware/mw.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage middleware\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/pkg/endpoint\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n)\n\nfunc ServerMiddleware(next endpoint.Endpoint) endpoint.Endpoint {\n\treturn func(ctx context.Context, req, resp interface{}) (err error) {\n\t\tri := rpcinfo.GetRPCInfo(ctx)\n\t\t// get client serviceName\n\t\tklog.Infof(\"client serviceName: %v\\n\", ri.From().ServiceName())\n\t\tif err := next(ctx, req, resp); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/payment.sql",
    "content": "create table payment\n(\n    id             int auto_increment,\n    user_id        int            not null,\n    order_id       varchar(100)   not null,\n    transaction_id varchar(100)   not null,\n    amount         decimal(10, 2) not null,\n    pay_at         datetime       not null,\n    created_at     datetime       not null default current_timestamp,\n    updated_at     datetime       not null default current_timestamp on update current_timestamp,\n    constraint payment_pk primary key (id)\n);"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/payment\"\nexec \"$CURDIR/bin/payment\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/payment/utils/errors.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n.env"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.Product{})\n\t\tDB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.Product{},\n\t\t\t&model.Category{},\n\t\t)\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `product`.`category` VALUES (1,'2023-12-06 15:05:06','2023-12-06 15:05:06','T-Shirt','T-Shirt'),(2,'2023-12-06 15:05:06','2023-12-06 15:05:06','Sticker','Sticker')\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product` VALUES ( 1, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Notebook', 'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ', '/static/image/notebook.jpeg', 9.90 ), ( 2, '2023-12-06 15:26:19', '2023-12-09 22:29:10', 'Mouse-Pad', 'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ', '/static/image/mouse-pad.jpeg', 8.80 ), ( 3, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt.jpeg', 6.60 ), ( 4, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-1.jpeg', 2.20 ), ( 5, '2023-12-06 15:26:19', '2023-12-09 22:32:35', 'Sweatshirt', 'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.', '/static/image/sweatshirt.jpeg', 1.10 ), ( 6, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'T-Shirt', 'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.', '/static/image/t-shirt-2.jpeg', 1.80 ), ( 7, '2023-12-06 15:26:19', '2023-12-09 22:31:20', 'mascot', 'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.', '/static/image/logo.jpg', 4.80 )\")\n\t\t\tDB.Exec(\"INSERT INTO `product`.`product_category` (product_id,category_id) VALUES ( 1, 2 ), ( 2, 2 ), ( 3, 1 ), ( 4, 1 ), ( 5, 1 ), ( 6, 1 ),( 7, 2 )\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/redis/go-redis/extra/redisotel/v9\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n\tredisotel.InstrumentTracing(RedisClient) //nolint:errcheck\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"time\"\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/model/category.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype Category struct {\n\tBase\n\tName        string    `json:\"name\"`\n\tDescription string    `json:\"description\"`\n\tProducts    []Product `json:\"product\" gorm:\"many2many:product_category\"`\n}\n\nfunc (c Category) TableName() string {\n\treturn \"category\"\n}\n\nfunc GetProductsByCategoryName(db *gorm.DB, ctx context.Context, name string) (category []Category, err error) {\n\terr = db.WithContext(ctx).Model(&Category{}).Where(&Category{Name: name}).Preload(\"Products\").Find(&category).Error\n\treturn category, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/model/product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"gorm.io/gorm\"\n)\n\ntype Product struct {\n\tBase\n\tName        string     `json:\"name\"`\n\tDescription string     `json:\"description\"`\n\tPicture     string     `json:\"picture\"`\n\tPrice       float32    `json:\"price\"`\n\tCategories  []Category `json:\"categories\" gorm:\"many2many:product_category\"`\n}\n\nfunc (p Product) TableName() string {\n\treturn \"product\"\n}\n\ntype ProductQuery struct {\n\tctx context.Context\n\tdb  *gorm.DB\n}\n\nfunc (p ProductQuery) GetById(productId int) (product Product, err error) {\n\terr = p.db.WithContext(p.ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn\n}\n\nfunc NewProductQuery(ctx context.Context, db *gorm.DB) ProductQuery {\n\treturn ProductQuery{ctx: ctx, db: db}\n}\n\ntype CachedProductQuery struct {\n\tproductQuery ProductQuery\n\tcacheClient  *redis.Client\n\tprefix       string\n}\n\nfunc (c CachedProductQuery) GetById(productId int) (product Product, err error) {\n\tcacheKey := fmt.Sprintf(\"%s_%s_%d\", c.prefix, \"product_by_id\", productId)\n\tcachedResult := c.cacheClient.Get(c.productQuery.ctx, cacheKey)\n\n\terr = func() error {\n\t\terr1 := cachedResult.Err()\n\t\tif err1 != nil {\n\t\t\treturn err1\n\t\t}\n\t\tcachedResultByte, err2 := cachedResult.Bytes()\n\t\tif err2 != nil {\n\t\t\treturn err2\n\t\t}\n\t\terr3 := json.Unmarshal(cachedResultByte, &product)\n\t\tif err3 != nil {\n\t\t\treturn err3\n\t\t}\n\t\treturn nil\n\t}()\n\n\tif err != nil {\n\t\tproduct, err = c.productQuery.GetById(productId)\n\t\tif err != nil {\n\t\t\treturn Product{}, err\n\t\t}\n\t\tencoded, err := json.Marshal(product)\n\t\tif err != nil {\n\t\t\treturn product, nil\n\t\t}\n\t\t_ = c.cacheClient.Set(c.productQuery.ctx, cacheKey, encoded, time.Hour)\n\t}\n\treturn\n}\n\nfunc NewCachedProductQuery(pq ProductQuery, cacheClient *redis.Client) CachedProductQuery {\n\treturn CachedProductQuery{productQuery: pq, cacheClient: cacheClient, prefix: \"cloudwego_shop\"}\n}\n\nfunc GetProductById(db *gorm.DB, ctx context.Context, productId int) (product Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Where(&Product{Base: Base{ID: productId}}).First(&product).Error\n\treturn product, err\n}\n\nfunc SearchProduct(db *gorm.DB, ctx context.Context, q string) (product []*Product, err error) {\n\terr = db.WithContext(ctx).Model(&Product{}).Find(&product, \"name like ? or description like ?\", \"%\"+q+\"%\", \"%\"+q+\"%\").Error\n\treturn product, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/service/get_product.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/redis\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype GetProductService struct {\n\tctx context.Context\n} // NewGetProductService new GetProductService\nfunc NewGetProductService(ctx context.Context) *GetProductService {\n\treturn &GetProductService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *GetProductService) Run(req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\t// Finish your business logic.\n\tif req.Id == 0 {\n\t\treturn nil, kerrors.NewBizStatusError(40000, \"product id is required\")\n\t}\n\n\tp, err := model.NewCachedProductQuery(model.NewProductQuery(s.ctx, mysql.DB), redis.RedisClient).GetById(int(req.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &product.GetProductResp{\n\t\tProduct: &product.Product{\n\t\t\tId:          uint32(p.ID),\n\t\t\tPicture:     p.Picture,\n\t\t\tPrice:       p.Price,\n\t\t\tDescription: p.Description,\n\t\t\tName:        p.Name,\n\t\t},\n\t}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/service/get_product_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetProduct_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewGetProductService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.GetProductRequest{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/service/list_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype ListProductsService struct {\n\tctx context.Context\n} // NewListProductsService new ListProductsService\nfunc NewListProductsService(ctx context.Context) *ListProductsService {\n\treturn &ListProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *ListProductsService) Run(req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\t// Finish your business logic.\n\tc, err := model.GetProductsByCategoryName(mysql.DB, s.ctx, req.CategoryName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp = &product.ListProductsResp{}\n\tfor _, v1 := range c {\n\t\tfor _, v := range v1.Products {\n\t\t\tresp.Products = append(resp.Products, &product.Product{Id: uint32(v.ID), Name: v.Name, Description: v.Description, Picture: v.Picture, Price: v.Price})\n\t\t}\n\t}\n\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/service/list_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestListProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewListProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.ListProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/service/search_products.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/model\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\ntype SearchProductsService struct {\n\tctx context.Context\n} // NewSearchProductsService new SearchProductsService\nfunc NewSearchProductsService(ctx context.Context) *SearchProductsService {\n\treturn &SearchProductsService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *SearchProductsService) Run(req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\t// Finish your business logic.\n\tp, err := model.SearchProduct(mysql.DB, s.ctx, req.Query)\n\tvar results []*product.Product\n\tfor _, v := range p {\n\t\tresults = append(results, &product.Product{\n\t\t\tId:          uint32(v.ID),\n\t\t\tName:        v.Name,\n\t\t\tDescription: v.Description,\n\t\t\tPicture:     v.Picture,\n\t\t\tPrice:       v.Price,\n\t\t})\n\t}\n\treturn &product.SearchProductsResp{Results: results}, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/biz/service/search_products_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestSearchProducts_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewSearchProductsService(ctx)\n\t// // init req and assert value\n\n\t// req := &product.SearchProductsReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"product\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n\t// Centralized Config Server\n\tConfigServer ConfigServer `yaml:\"configServer\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\ntype ConfigServer struct{}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"product\"\n  address: \":8881\"\n  metrics_port: \":9991\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/product?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/product\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nreplace github.com/cloudwego/biz-demo/gomall/common => ../../common\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/coreos/go-semver v0.3.0 // indirect\n\tgithub.com/coreos/go-systemd/v22 v22.3.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-etcd v0.1.0 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.18.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.etcd.io/etcd/api/v3 v3.5.10 // indirect\n\tgo.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect\n\tgo.etcd.io/etcd/client/v3 v3.5.10 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.26.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-etcd v0.1.0 h1:yDsIeQYEFYonjexoESsjFImdCFeU2emqZYe0a0AGCW0=\ngithub.com/kitex-contrib/config-etcd v0.1.0/go.mod h1:Brun1ZoAIJNzhO/cs4ZsJqSdKx0kYxheOnVpUQYO5HA=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho=\ngithub.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc=\ngithub.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ=\ngithub.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k=\ngo.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U=\ngo.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao=\ngo.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/service\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n)\n\n// ProductCatalogServiceImpl implements the last service interface defined in the IDL.\ntype ProductCatalogServiceImpl struct{}\n\n// ListProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) ListProducts(ctx context.Context, req *product.ListProductsReq) (resp *product.ListProductsResp, err error) {\n\tresp, err = service.NewListProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// GetProduct implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) GetProduct(ctx context.Context, req *product.GetProductReq) (resp *product.GetProductResp, err error) {\n\tresp, err = service.NewGetProductService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// SearchProducts implements the ProductCatalogServiceImpl interface.\nfunc (s *ProductCatalogServiceImpl) SearchProducts(ctx context.Context, req *product.SearchProductsReq) (resp *product.SearchProductsResp, err error) {\n\tresp, err = service.NewSearchProductsService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'product'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/product/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := productcatalogservice.NewServer(new(ProductCatalogServiceImpl), opts...)\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\tserviceName := conf.GetConf().Kitex.Service\n\n\topts = append(opts,\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/product\"\nexec \"$CURDIR/bin/product\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/script/product.sql",
    "content": "CREATE TABLE `category`\n(\n    `id`          int          NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)  NOT NULL,\n    `description` varchar(255) NOT NULL,\n    `created_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `category`\nVALUES (1, 'Clothes', 'Clothes', '2023-12-06 15:05:06', '2023-12-06 15:05:06'),\n       (2, 'Other', 'Other', '2023-12-06 15:05:06', '2023-12-06 15:05:06');\nCREATE TABLE `product`\n(\n    `id`          int            NOT NULL AUTO_INCREMENT,\n    `name`        varchar(50)    NOT NULL,\n    `description` varchar(255)   NOT NULL,\n    `picture`     varchar(255)   NOT NULL,\n    `price`       decimal(10, 2) NOT NULL,\n    `created_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product`\nVALUES (1, 'Notebook',\n        'The cloudwego notebook is a highly efficient and feature-rich notebook designed to meet all your note-taking needs. ',\n        '/static/image/notebook.jpeg', 9.90, '2023-12-06 15:26:19', '2023-12-09 22:29:10'),\n       (2, 'Mouse-Pad',\n        'The cloudwego mouse pad is a premium-grade accessory designed to enhance your computer usage experience. ',\n        '/static/image/mouse-pad.jpeg', 8.80, '2023-12-06 15:26:19', '2023-12-09 22:29:59'),\n       (3, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt.jpeg', 6.60, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (4, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-1.jpeg', 2.20, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (5, 'Sweatshirt',\n        'The cloudwego Sweatshirt is a cozy and fashionable garment that provides warmth and style during colder weather.',\n        '/static/image/sweatshirt.jpeg', 1.10, '2023-12-06 15:26:19', '2023-12-09 22:32:35'),\n       (6, 'T-Shirt',\n        'The cloudwego t-shirt is a stylish and comfortable clothing item that allows you to showcase your fashion sense while enjoying maximum comfort.',\n        '/static/image/t-shirt-2.jpeg', 1.80, '2023-12-06 15:26:19', '2023-12-09 22:31:20'),\n       (10, 'mascot',\n        'The cloudwego mascot is a charming and captivating representation of the brand, designed to bring joy and a playful spirit to any environment.',\n        '/static/image/logo.jpg', 4.80, '2023-12-06 15:26:19', '2023-12-09 22:39:47');\nCREATE TABLE `product_category`\n(\n    `id`          int      NOT NULL AUTO_INCREMENT,\n    `product_id`  int      NOT NULL,\n    `category_id` int      NOT NULL,\n    `created_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\nINSERT INTO `product_category`\nVALUES (1, 1, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (2, 2, 2, '2023-12-06 15:27:30', '2023-12-09 22:41:29'),\n       (3, 3, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (4, 4, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (5, 5, 1, '2023-12-06 15:27:30', '2023-12-06 15:27:30'),\n       (6, 6, 1, '2023-12-06 15:27:30', '2023-12-09 22:41:47'),\n       (10, 10, 2, '2023-12-06 15:27:30', '2023-12-06 15:27:30');"
  },
  {
    "path": "gomall/tutorial/ch17/app/product/utils/constant.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nconst ServiceName = \"shop-product\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n\n.env"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\tneedDemoData := !DB.Migrator().HasTable(&model.User{})\n\t\terr := DB.AutoMigrate( //nolint:errcheck\n\t\t\t&model.User{},\n\t\t)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif needDemoData {\n\t\t\tDB.Exec(\"INSERT INTO `user` (`id`,`created_at`,`updated_at`,`email`,`password_hashed`) VALUES (1,'2023-12-26 09:46:19.852','2023-12-26 09:46:19.852','123@admin.com','$2a$10$jTvUFh7Z8Kw0hLV8WrAws.PRQTeuH4gopJ7ZMoiFvwhhz5Vw.bj7C')\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar RedisClient *redis.Client\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/biz/model/base.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"time\"\n)\n\ntype Base struct {\n\tID        int `gorm:\"primarykey\"`\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport (\n\t\"context\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype User struct {\n\tBase\n\tEmail          string `gorm:\"unique\"`\n\tPasswordHashed string\n}\n\nfunc (u User) TableName() string {\n\treturn \"user\"\n}\n\nfunc GetByEmail(db *gorm.DB, ctx context.Context, email string) (user *User, err error) {\n\terr = db.WithContext(ctx).Model(&User{}).Where(&User{Email: email}).First(&user).Error\n\treturn\n}\n\nfunc Create(db *gorm.DB, ctx context.Context, user *User) error {\n\treturn db.WithContext(ctx).Create(user).Error\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/biz/service/login.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype LoginService struct {\n\tctx context.Context\n} // NewLoginService new LoginService\nfunc NewLoginService(ctx context.Context) *LoginService {\n\treturn &LoginService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *LoginService) Run(req *user.LoginReq) (resp *user.LoginResp, err error) {\n\t// Finish your business logic.\n\tklog.Infof(\"LoginReq:%+v\", req)\n\tuserRow, err := model.GetByEmail(mysql.DB, s.ctx, req.Email)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = bcrypt.CompareHashAndPassword([]byte(userRow.PasswordHashed), []byte(req.Password))\n\tif err != nil {\n\t\treturn\n\t}\n\treturn &user.LoginResp{UserId: int32(userRow.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/biz/service/login_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestLogin_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewLoginService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.LoginReq{\n\t// \tEmail:    \"1111@qq.com\",\n\t// \tPassword: \"123\",\n\t// }\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// // todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/biz/service/register.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype RegisterService struct {\n\tctx context.Context\n} // NewRegisterService new RegisterService\nfunc NewRegisterService(ctx context.Context) *RegisterService {\n\treturn &RegisterService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *RegisterService) Run(req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\t// Finish your business logic.\n\tif req.Password != req.ConfirmPassword {\n\t\terr = errors.New(\"Password must be the same as ConfirmPassword\")\n\t\treturn\n\t}\n\thashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn\n\t}\n\tnewUser := &model.User{\n\t\tEmail:          req.Email,\n\t\tPasswordHashed: string(hashedPassword),\n\t}\n\tif err = model.Create(mysql.DB, s.ctx, newUser); err != nil {\n\t\treturn\n\t}\n\n\treturn &user.RegisterResp{UserId: int32(newUser.ID)}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/biz/service/register_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"testing\"\n)\n\nfunc TestRegister_Run(t *testing.T) {\n\t// ctx := context.Background()\n\t// s := NewRegisterService(ctx)\n\t// // init req and assert value\n\n\t// req := &user.RegisterReq{}\n\t// resp, err := s.Run(req)\n\t// if err != nil {\n\t// \tt.Errorf(\"unexpected error: %v\", err)\n\t// }\n\t// if resp == nil {\n\t// \tt.Errorf(\"unexpected nil response\")\n\t// }\n\t// todo: edit your unit test\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"user\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tMetricsPort     string `yaml:\"metrics_port\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"user\"\n  address: \":8882\"\n  metrics_port: \":9992\"\n  log_level: debug\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/user?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/app/user\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nreplace github.com/cloudwego/biz-demo/gomall/rpc_gen => ../../rpc_gen\n\nrequire (\n\tgithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0\n\tgithub.com/cloudwego/biz-demo/gomall/rpc_gen v0.0.0-00010101000000-000000000000\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.6\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgolang.org/x/crypto v0.40.0\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 // indirect\n\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-consul v0.1.2 // indirect\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0 // indirect\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.25.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.25.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.1.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect\n\tgoogle.golang.org/grpc v1.63.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tsigs.k8s.io/yaml v1.4.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0 h1:mk0fDU8MbzecUPe1cz97VoFDc51wuDDC+U7JauHMJ0w=\ngithub.com/cloudwego/biz-demo/gomall/common v0.0.0-20250630130430-ad208cf0a3d0/go.mod h1:H19IWGXlkGGL93UaSf4uYMxO17mAXH4UFSOFfbiQZ8E=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=\ngithub.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\ngithub.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-consul v0.1.2 h1:pAiL3rWihXwgcBd/w/s3tUQ3EYtMk9tggR3LLFaKHJs=\ngithub.com/kitex-contrib/config-consul v0.1.2/go.mod h1:FQ0J0sNG57FXl/Zb9qPzkxPNCO0ZLDyBZTtOY447idg=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6 h1:MuMA5pgDielcaWLYElv1sBBGnSQaEcCu8GulBdtPgk8=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.6/go.mod h1:QyvKnBxTCeGKMg2CrqS+eMDpZfqo4Z2ZmdgWT4iPUh8=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853 h1:zBa62iI4Ke4GCq9Wln3evFOYlQLh0zPYq1lHf8y3lAM=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20240305123358-828863cc5853/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=\ngo.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=\ngo.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=\ngo.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo=\ngo.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=\ngo.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=\ngo.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=\ngo.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=\ngolang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=\ngoogle.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=\ngoogle.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=\nsigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/service\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n)\n\n// UserServiceImpl implements the last service interface defined in the IDL.\ntype UserServiceImpl struct{}\n\n// Register implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Register(ctx context.Context, req *user.RegisterReq) (resp *user.RegisterResp, err error) {\n\tresp, err = service.NewRegisterService(ctx).Run(req)\n\n\treturn resp, err\n}\n\n// Login implements the UserServiceImpl interface.\nfunc (s *UserServiceImpl) Login(ctx context.Context, req *user.LoginReq) (resp *user.LoginResp, err error) {\n\tresp, err = service.NewLoginService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'user'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/app/user/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/biz-demo/gomall/common/serversuite\"\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nvar serviceName = conf.GetConf().Kitex.Service\n\nfunc main() {\n\t_ = godotenv.Load()\n\tmtl.InitMetric(serviceName, conf.GetConf().Kitex.MetricsPort, conf.GetConf().Registry.RegistryAddress[0])\n\tmtl.InitTracing(serviceName)\n\tmtl.InitLog()\n\tdal.Init()\n\topts := kitexInit()\n\n\tsvr := userservice.NewServer(new(UserServiceImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),\n\t\tserver.WithSuite(serversuite.CommonServerSuite{CurrentServiceName: serviceName}),\n\t)\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\topts = append(opts, server.WithSuite(tracing.NewServerSuite()))\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch17/app/user/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/user\"\nexec \"$CURDIR/bin/user\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/common/clientsuite/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage clientsuite\n\nimport (\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\t\"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n)\n\ntype CommonGrpcClientSuite struct {\n\tDestServiceName    string\n\tDestServiceAddr    string\n\tCurrentServiceName string\n\tTracerProvider     *tracesdk.TracerProvider\n}\n\nfunc (s CommonGrpcClientSuite) Options() []client.Option {\n\topts := []client.Option{\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t}\n\n\t_ = provider.NewOpenTelemetryProvider(provider.WithSdkTracerProvider(s.TracerProvider), provider.WithEnableMetrics(false))\n\n\topts = append(opts,\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\t\tServiceName: s.CurrentServiceName,\n\t\t}),\n\t\tclient.WithSuite(tracing.NewClientSuite()),\n\t)\n\n\treturn opts\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/common/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/common\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire (\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3\n\tgithub.com/kitex-contrib/obs-opentelemetry v0.2.5\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/prometheus/client_golang v1.18.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.21.0\n\tgo.uber.org/zap v1.26.0\n)\n\nrequire (\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/cloudwego/hertz v0.7.3 // indirect\n\tgithub.com/coreos/go-semver v0.3.0 // indirect\n\tgithub.com/coreos/go-systemd/v22 v22.3.2 // indirect\n\tgithub.com/go-logr/logr v1.3.0 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect\n\tgo.etcd.io/etcd/api/v3 v3.5.10 // indirect\n\tgo.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect\n\tgo.etcd.io/etcd/client/v3 v3.5.10 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect\n\tgo.opentelemetry.io/contrib/propagators/ot v1.20.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect\n\tgoogle.golang.org/grpc v1.59.0 // indirect\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kitex-contrib/config-etcd v0.1.0\n\tgithub.com/kitex-contrib/monitor-prometheus v0.2.0\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.45.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n"
  },
  {
    "path": "gomall/tutorial/ch17/common/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3 h1:SO/KKRPhh2lbheQf89PqIrDdeDqH6a74i3XG0SXXxvQ=\ngithub.com/hertz-contrib/obs-opentelemetry/provider v0.2.3/go.mod h1:neuPg2FGeUZ5z1dxzkrvcPTtmOBcHhsXVGlprpGOwts=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/config-etcd v0.1.0 h1:yDsIeQYEFYonjexoESsjFImdCFeU2emqZYe0a0AGCW0=\ngithub.com/kitex-contrib/config-etcd v0.1.0/go.mod h1:Brun1ZoAIJNzhO/cs4ZsJqSdKx0kYxheOnVpUQYO5HA=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0 h1:cgu8UMn1lpwLD/6rQZnf3jX98rqazTkY/ATmN9DsCwY=\ngithub.com/kitex-contrib/monitor-prometheus v0.2.0/go.mod h1:ZHWQOKRHnN1Bw+PgVYeOXmB9l4+k8dlOJ9wx2xz76NU=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5 h1:vV0rbEQnhv7gFPJJPAas4mvp0vopOUC3RU05pnXDOAw=\ngithub.com/kitex-contrib/obs-opentelemetry v0.2.5/go.mod h1:+Hfa6yIiSOIL364QSiUyWTQARkV1OI/NU527SKw+/kk=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3 h1:R6nzUKoxpSFP9+fzeRy30RDIRW8rY4lQZSf7i0jxiTE=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/zap v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:t9iabI0fK17O94vjXb6RfI69YOpenwxHLsR9ppWBBWs=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=\ngithub.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=\ngithub.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=\ngithub.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k=\ngo.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U=\ngo.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao=\ngo.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q=\ngo.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0=\ngo.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0 h1:duH7mgL6VGQH7e7QEAVOFkCQXWpCb4PjTtrhdrYrJRQ=\ngo.opentelemetry.io/contrib/propagators/ot v1.20.0/go.mod h1:gijQzxOq0JLj9lyZhTvqjDddGV/zaNagpPIn+2r8CEI=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM=\ngo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=\ngo.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "gomall/tutorial/ch17/common/mtl/log.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexzap \"github.com/kitex-contrib/obs-opentelemetry/logging/zap\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\"\n)\n\nfunc InitLog() {\n\tvar opts []kitexzap.Option\n\tvar output zapcore.WriteSyncer\n\tif os.Getenv(\"GO_ENV\") != \"online\" {\n\t\topts = append(opts, kitexzap.WithCoreEnc(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())))\n\t\toutput = os.Stdout\n\t} else {\n\t\topts = append(opts, kitexzap.WithCoreEnc(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())))\n\t\t// async log\n\t\toutput = &zapcore.BufferedWriteSyncer{\n\t\t\tWS:            zapcore.AddSync(os.Stdout),\n\t\t\tFlushInterval: time.Minute,\n\t\t}\n\t\tserver.RegisterShutdownHook(func() {\n\t\t\toutput.Sync() //nolint:errcheck\n\t\t})\n\t}\n\tlog := kitexzap.NewLogger(opts...)\n\tklog.SetLogger(log)\n\tklog.SetLevel(klog.LevelTrace)\n\tklog.SetOutput(output)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/common/mtl/metrics.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"net\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/kitex/pkg/registry\"\n\t\"github.com/cloudwego/kitex/server\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/collectors\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n)\n\nvar Registry *prometheus.Registry\n\nfunc InitMetric(serviceName string, metricsPort string, registryAddr string) {\n\tRegistry = prometheus.NewRegistry()\n\tRegistry.MustRegister(collectors.NewGoCollector())\n\tRegistry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))\n\n\tr, _ := consul.NewConsulRegister(registryAddr)\n\n\taddr, _ := net.ResolveTCPAddr(\"tcp\", metricsPort)\n\n\tregistryInfo := &registry.Info{\n\t\tServiceName: \"prometheus\",\n\t\tAddr:        addr,\n\t\tWeight:      1,\n\t\tTags:        map[string]string{\"service\": serviceName},\n\t}\n\n\t_ = r.Register(registryInfo)\n\n\tserver.RegisterShutdownHook(func() {\n\t\tr.Deregister(registryInfo) //nolint:errcheck\n\t})\n\n\thttp.Handle(\"/metrics\", promhttp.HandlerFor(Registry, promhttp.HandlerOpts{}))\n\tgo http.ListenAndServe(metricsPort, nil) //nolint:errcheck\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/common/mtl/tracing.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mtl\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/kitex/server\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\ttracesdk \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.17.0\"\n)\n\nvar TracerProvider *tracesdk.TracerProvider\n\nfunc InitTracing(serviceName string) {\n\texporter, err := otlptracegrpc.New(context.Background())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tserver.RegisterShutdownHook(func() {\n\t\texporter.Shutdown(context.Background()) //nolint:errcheck\n\t})\n\tprocessor := tracesdk.NewBatchSpanProcessor(exporter)\n\tres, err := resource.New(context.Background(), resource.WithAttributes(semconv.ServiceNameKey.String(serviceName)))\n\tif err != nil {\n\t\tres = resource.Default()\n\t}\n\tTracerProvider = tracesdk.NewTracerProvider(tracesdk.WithSpanProcessor(processor), tracesdk.WithResource(res))\n\totel.SetTracerProvider(TracerProvider)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/common/serversuite/server.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage serversuite\n\nimport (\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/common/mtl\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/hertz-contrib/obs-opentelemetry/provider\"\n\t\"github.com/kitex-contrib/config-etcd/etcd\"\n\tetcdServer \"github.com/kitex-contrib/config-etcd/server\"\n\tprometheus \"github.com/kitex-contrib/monitor-prometheus\"\n\t\"github.com/kitex-contrib/obs-opentelemetry/tracing\"\n)\n\ntype CommonServerSuite struct {\n\tCurrentServiceName string\n}\n\nfunc (s CommonServerSuite) Options() []server.Option {\n\n\topts := []server.Option{\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t}\n\n\tif os.Getenv(\"CONFIG_CENTER_ENABLED\") == \"true\" {\n\t\tetcdNodes := os.Getenv(\"CONFIG_CENTER_NODES\")\n\t\tif etcdNodes != \"\" {\n\t\t\tetcdClient, err := etcd.NewClient(etcd.Options{Node: strings.Split(etcdNodes, \",\")})\n\t\t\tif err != nil {\n\t\t\t\tklog.Error(err)\n\t\t\t} else {\n\t\t\t\topts = append(opts, server.WithSuite(etcdServer.NewSuite(s.CurrentServiceName, etcdClient)))\n\t\t\t}\n\t\t}\n\t}\n\n\t_ = provider.NewOpenTelemetryProvider(provider.WithSdkTracerProvider(mtl.TracerProvider), provider.WithEnableMetrics(false))\n\n\topts = append(opts,\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\t\tServiceName: s.CurrentServiceName,\n\t\t}),\n\t\tserver.WithSuite(tracing.NewServerSuite()),\n\t\tserver.WithTracer(prometheus.NewServerTracer(\"\", \"\", prometheus.WithDisableServer(true), prometheus.WithRegistry(mtl.Registry))),\n\t)\n\n\treturn opts\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/common/utils/kitex.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport \"github.com/cloudwego/kitex/pkg/klog\"\n\n// MustHandleError log the error info and then exit\nfunc MustHandleError(err error) {\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n\n// ShouldHandleError log the error info\nfunc ShouldHandleError(err error) {\n\tif err != nil {\n\t\tklog.Error(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/db/sql/ini/README.md",
    "content": "## INI SQL\nExecute before preparing the development environment"
  },
  {
    "path": "gomall/tutorial/ch17/db/sql/ini/databases.sql",
    "content": " CREATE DATABASE IF NOT EXISTS `cart`  \n    DEFAULT CHARACTER SET = 'utf8mb4';;\n\nCREATE DATABASE IF NOT EXISTS `checkout`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `order`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `payment`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `product`\n    DEFAULT CHARACTER SET = 'utf8mb4';\n\nCREATE DATABASE IF NOT EXISTS `user`\n    DEFAULT CHARACTER SET = 'utf8mb4';"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n)\n\nfunc Init() {\n\t// redis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tdsn := fmt.Sprintf(conf.GetConf().MySQL.DSN, os.Getenv(\"MYSQL_USER\"), os.Getenv(\"MYSQL_PASSWORD\"), os.Getenv(\"MYSQL_HOST\"), os.Getenv(\"MYSQL_DATABASE\"))\n\tDB, err = gorm.Open(mysql.Open(dsn),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tDB.AutoMigrate(model.User{})\n\tfmt.Printf(\"%#v\", DB.Debug().Exec(\"select version()\"))\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/biz/model/user.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model\n\nimport \"gorm.io/gorm\"\n\ntype User struct {\n\tgorm.Model\n\tEmail    string `gorm:\"unique\"`\n\tPassword string `gorm:\"varchar(64),not null\"`\n}\n\nfunc (u User) TableName() string {\n\treturn \"user\"\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *pbapi.Request) (resp *pbapi.Response, err error) {\n\n\treturn &pbapi.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"testing\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &pbapi.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_proto\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_proto\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.GRPC),\n\t\tclient.WithMetaHandler(transmeta.ClientHTTP2Handler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_proto_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &pbapi.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/cmd/dbop/db.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model\"\n\t\"github.com/joho/godotenv\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdal.Init()\n\tmysql.DB.Create(&model.User{Email: \"demo@example.com\", Password: \"a958af3702caf245d205da6164afebe0\"})\n\tvar u model.User\n\tmysql.DB.First(&u)\n\tfmt.Printf(\"%#v\", u)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := os.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_proto\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_proto\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.4\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgoogle.golang.org/protobuf v1.32.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0 // indirect\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/service\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *pbapi.Request) (resp *pbapi.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/kitex_gen/pbapi/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, Req *pbapi.Request, callOptions ...callopt.Option) (r *pbapi.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/kitex_gen/pbapi/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*pbapi.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Echo\": kitex.NewMethodInfo(echoHandler, newEchoArgs, newEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"pbapi\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(pbapi.Request)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(pbapi.Echo).Echo(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EchoArgs:\n\t\tsuccess, err := handler.(pbapi.Echo).Echo(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EchoResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEchoArgs() interface{} {\n\treturn &EchoArgs{}\n}\n\nfunc newEchoResult() interface{} {\n\treturn &EchoResult{}\n}\n\ntype EchoArgs struct {\n\tReq *pbapi.Request\n}\n\nfunc (p *EchoArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(pbapi.Request)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EchoArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EchoArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EchoArgs) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Request)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EchoArgs_Req_DEFAULT *pbapi.Request\n\nfunc (p *EchoArgs) GetReq() *pbapi.Request {\n\tif !p.IsSetReq() {\n\t\treturn EchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EchoResult struct {\n\tSuccess *pbapi.Response\n}\n\nvar EchoResult_Success_DEFAULT *pbapi.Response\n\nfunc (p *EchoResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(pbapi.Response)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EchoResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EchoResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EchoResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EchoResult) Unmarshal(in []byte) error {\n\tmsg := new(pbapi.Response)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EchoResult) GetSuccess() *pbapi.Response {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*pbapi.Response)\n}\n\nfunc (p *EchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, Req *pbapi.Request) (r *pbapi.Response, err error) {\n\tvar _args EchoArgs\n\t_args.Req = Req\n\tvar _result EchoResult\n\tif err = p.c.Call(ctx, \"Echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/kitex_gen/pbapi/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler pbapi.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/kitex_gen/pbapi/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tpbapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler pbapi.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/kitex_gen/pbapi/echo.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage pbapi\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Request) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Request[number], err)\n}\n\nfunc (x *Request) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Response) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Response[number], err)\n}\n\nfunc (x *Response) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Message, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Request) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Request) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Response) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Response) fastWriteField1(buf []byte) (offset int) {\n\tif x.Message == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetMessage())\n\treturn offset\n}\n\nfunc (x *Request) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Request) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nfunc (x *Response) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *Response) sizeField1() (n int) {\n\tif x.Message == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetMessage())\n\treturn n\n}\n\nvar fieldIDToName_Request = map[int32]string{\n\t1: \"Message\",\n}\n\nvar fieldIDToName_Response = map[int32]string{\n\t1: \"Message\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/kitex_gen/pbapi/echo.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: echo.proto\n\npackage pbapi\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Request) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Response) Reset() {\n\t*x = Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_echo_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Response) ProtoMessage() {}\n\nfunc (x *Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_echo_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Response.ProtoReflect.Descriptor instead.\nfunc (*Response) Descriptor() ([]byte, []int) {\n\treturn file_echo_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Response) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nvar File_echo_proto protoreflect.FileDescriptor\n\nvar file_echo_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x65, 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x62,\n\t0x61, 0x70, 0x69, 0x22, 0x23, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x31,\n\t0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x29, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x0e,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f,\n\t0x2e, 0x70, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x64,\n\t0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f,\n\t0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_echo_proto_rawDescOnce sync.Once\n\tfile_echo_proto_rawDescData = file_echo_proto_rawDesc\n)\n\nfunc file_echo_proto_rawDescGZIP() []byte {\n\tfile_echo_proto_rawDescOnce.Do(func() {\n\t\tfile_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_echo_proto_rawDescData)\n\t})\n\treturn file_echo_proto_rawDescData\n}\n\nvar file_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_echo_proto_goTypes = []interface{}{\n\t(*Request)(nil),  // 0: pbapi.Request\n\t(*Response)(nil), // 1: pbapi.Response\n}\nvar file_echo_proto_depIdxs = []int32{\n\t0, // 0: pbapi.Echo.Echo:input_type -> pbapi.Request\n\t1, // 1: pbapi.Echo.Echo:output_type -> pbapi.Response\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_echo_proto_init() }\nfunc file_echo_proto_init() {\n\tif File_echo_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_echo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_echo_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_echo_proto_goTypes,\n\t\tDependencyIndexes: file_echo_proto_depIdxs,\n\t\tMessageInfos:      file_echo_proto_msgTypes,\n\t}.Build()\n\tFile_echo_proto = out.File\n\tfile_echo_proto_rawDesc = nil\n\tfile_echo_proto_goTypes = nil\n\tfile_echo_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (res *Response, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_proto'\n  ToolVersion: 'v0.8.0'\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/kitex_gen/pbapi/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/joho/godotenv\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\terr := godotenv.Load()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\topts := kitexInit()\n\n\tdal.Init()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts,\n\t\tserver.WithMetaHandler(transmeta.ServerHTTP2Handler),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: conf.GetConf().Kitex.Service}),\n\t)\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\tasyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_proto/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_proto\"\nexec \"$CURDIR/bin/demo_proto\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/biz/dal/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage dal\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/mysql\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/dal/redis\"\n)\n\nfunc Init() {\n\tredis.Init()\n\tmysql.Init()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/biz/dal/mysql/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mysql\n\nimport (\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tDB  *gorm.DB\n\terr error\n)\n\nfunc Init() {\n\tDB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN),\n\t\t&gorm.Config{\n\t\t\tPrepareStmt:            true,\n\t\t\tSkipDefaultTransaction: true,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/biz/dal/redis/init.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage redis\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/redis/go-redis/v9\"\n)\n\nvar (\n\tRedisClient *redis.Client\n)\n\nfunc Init() {\n\tRedisClient = redis.NewClient(&redis.Options{\n\t\tAddr:     conf.GetConf().Redis.Address,\n\t\tUsername: conf.GetConf().Redis.Username,\n\t\tPassword: conf.GetConf().Redis.Password,\n\t\tDB:       conf.GetConf().Redis.DB,\n\t})\n\tif err := RedisClient.Ping(context.Background()).Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/biz/service/echo.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\ntype EchoService struct {\n\tctx context.Context\n} // NewEchoService new EchoService\nfunc NewEchoService(ctx context.Context) *EchoService {\n\treturn &EchoService{ctx: ctx}\n}\n\n// Run create note info\nfunc (s *EchoService) Run(req *api.Request) (resp *api.Response, err error) {\n\t// Finish your business logic.\n\n\treturn &api.Response{Message: req.Message}, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/biz/service/echo_test.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage service\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"testing\"\n)\n\nfunc TestEcho_Run(t *testing.T) {\n\tctx := context.Background()\n\ts := NewEchoService(ctx)\n\t// init req and assert value\n\n\treq := &api.Request{}\n\tresp, err := s.Run(req)\n\tt.Logf(\"err: %v\", err)\n\tt.Logf(\"resp: %v\", resp)\n\n\t// todo: edit your unit test\n\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"demo_thrift\"\nmkdir -p output/bin output/conf\ncp script/* output/\ncp -r conf/* output/conf\nchmod +x output/bootstrap.sh\ngo build -o output/bin/${RUN_NAME}"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/cmd/client/client.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n)\n\nfunc main() {\n\tr, err := consul.NewConsulResolver(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc, err := echo.NewClient(\"demo_thrift\", client.WithResolver(r),\n\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\tclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"demo_thrift_client\"}),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres, err := c.Echo(context.Background(), &api.Request{Message: \"hello\"})\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tfmt.Printf(\"%v\", res)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/conf/conf.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conf\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/kr/pretty\"\n\t\"gopkg.in/validator.v2\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar (\n\tconf *Config\n\tonce sync.Once\n)\n\ntype Config struct {\n\tEnv      string\n\tKitex    Kitex    `yaml:\"kitex\"`\n\tMySQL    MySQL    `yaml:\"mysql\"`\n\tRedis    Redis    `yaml:\"redis\"`\n\tRegistry Registry `yaml:\"registry\"`\n}\n\ntype MySQL struct {\n\tDSN string `yaml:\"dsn\"`\n}\n\ntype Redis struct {\n\tAddress  string `yaml:\"address\"`\n\tUsername string `yaml:\"username\"`\n\tPassword string `yaml:\"password\"`\n\tDB       int    `yaml:\"db\"`\n}\n\ntype Kitex struct {\n\tService         string `yaml:\"service\"`\n\tAddress         string `yaml:\"address\"`\n\tEnablePprof     bool   `yaml:\"enable_pprof\"`\n\tEnableGzip      bool   `yaml:\"enable_gzip\"`\n\tEnableAccessLog bool   `yaml:\"enable_access_log\"`\n\tLogLevel        string `yaml:\"log_level\"`\n\tLogFileName     string `yaml:\"log_file_name\"`\n\tLogMaxSize      int    `yaml:\"log_max_size\"`\n\tLogMaxBackups   int    `yaml:\"log_max_backups\"`\n\tLogMaxAge       int    `yaml:\"log_max_age\"`\n}\n\ntype Registry struct {\n\tRegistryAddress []string `yaml:\"registry_address\"`\n\tUsername        string   `yaml:\"username\"`\n\tPassword        string   `yaml:\"password\"`\n}\n\n// GetConf gets configuration instance\nfunc GetConf() *Config {\n\tonce.Do(initConf)\n\treturn conf\n}\n\nfunc initConf() {\n\tprefix := \"conf\"\n\tconfFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), \"conf.yaml\"))\n\tcontent, err := ioutil.ReadFile(confFileRelPath)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconf = new(Config)\n\terr = yaml.Unmarshal(content, conf)\n\tif err != nil {\n\t\tklog.Error(\"parse yaml error - %v\", err)\n\t\tpanic(err)\n\t}\n\tif err := validator.Validate(conf); err != nil {\n\t\tklog.Error(\"validate config error - %v\", err)\n\t\tpanic(err)\n\t}\n\tconf.Env = GetEnv()\n\tpretty.Printf(\"%+v\\n\", conf)\n}\n\nfunc GetEnv() string {\n\te := os.Getenv(\"GO_ENV\")\n\tif len(e) == 0 {\n\t\treturn \"test\"\n\t}\n\treturn e\n}\n\nfunc LogLevel() klog.Level {\n\tlevel := GetConf().Kitex.LogLevel\n\tswitch level {\n\tcase \"trace\":\n\t\treturn klog.LevelTrace\n\tcase \"debug\":\n\t\treturn klog.LevelDebug\n\tcase \"info\":\n\t\treturn klog.LevelInfo\n\tcase \"notice\":\n\t\treturn klog.LevelNotice\n\tcase \"warn\":\n\t\treturn klog.LevelWarn\n\tcase \"error\":\n\t\treturn klog.LevelError\n\tcase \"fatal\":\n\t\treturn klog.LevelFatal\n\tdefault:\n\t\treturn klog.LevelInfo\n\t}\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/conf/dev/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/conf/online/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:2379\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/conf/test/conf.yaml",
    "content": "kitex:\n  service: \"demo_thrift\"\n  address: \":8888\"\n  log_level: info\n  log_file_name: \"log/kitex.log\"\n  log_max_size: 10\n  log_max_age: 3\n  log_max_backups: 50\n\nregistry:\n  registry_address:\n    - 127.0.0.1:8500\n  username: \"\"\n  password: \"\"\n\nmysql:\n  dsn: \"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local\"\n\nredis:\n  address: \"127.0.0.1:6379\"\n  username: \"\"\n  password: \"\"\n  db: 0\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  mysql:\n    image: 'mysql:latest'\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_DATABASE=gorm\n      - MYSQL_USER=gorm\n      - MYSQL_PASSWORD=gorm\n      - MYSQL_RANDOM_ROOT_PASSWORD=\"yes\"\n  redis:\n    image: 'redis:latest'\n    ports:\n      - 6379:6379"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/demo/demo_thrift\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/apache/thrift v0.19.0\n\tgithub.com/cloudwego/kitex v0.8.0\n\tgithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3\n\tgithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654\n\tgithub.com/kr/pretty v0.3.1\n\tgithub.com/redis/go-redis/v9 v9.3.1\n\tgo.uber.org/zap v1.26.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/validator.v2 v2.0.1\n\tgopkg.in/yaml.v2 v2.4.0\n\tgorm.io/driver/mysql v1.5.2\n\tgorm.io/gorm v1.25.5\n)\n\nrequire (\n\tgithub.com/armon/go-metrics v0.4.1 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/choleraehyq/pid v0.0.17 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.0 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.1.6 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.4 // indirect\n\tgithub.com/cloudwego/frugal v0.1.12 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect\n\tgithub.com/fatih/color v1.16.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.7.1 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect\n\tgithub.com/hashicorp/consul/api v1.26.1 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-hclog v1.6.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n\tgithub.com/hashicorp/go-rootcerts v1.0.2 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/hashicorp/serf v0.10.1 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/kr/text v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/oleiade/lane v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/rogpeppe/go-internal v1.12.0 // indirect\n\tgithub.com/sirupsen/logrus v1.9.2 // indirect\n\tgithub.com/stretchr/testify v1.8.4 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgo.opentelemetry.io/otel v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.21.0 // indirect\n\tgo.uber.org/goleak v1.3.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\ngithub.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=\ngithub.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=\ngithub.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=\ngithub.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=\ngithub.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/choleraehyq/pid v0.0.17 h1:BLBfHTllp2nRRbZ/cOFHKlx9oWJuMwKmp7GqB5d58Hk=\ngithub.com/choleraehyq/pid v0.0.17/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=\ngithub.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo=\ngithub.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk=\ngithub.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg=\ngithub.com/cloudwego/dynamicgo v0.1.6 h1:ogGaEi5DTFlAgM940RLuOeP5QcNiQxj9GJ/7WeU1i4w=\ngithub.com/cloudwego/dynamicgo v0.1.6/go.mod h1:WzbIYLbhR4tjUhEMmRZRNIQXZu5J18oPurGDj5UmU9I=\ngithub.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.1.12 h1:/AFrjnMVOBBd6d5Vn59bU2IhlOP2vs/jQCsJ2seJBfs=\ngithub.com/cloudwego/frugal v0.1.12/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc=\ngithub.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0=\ngithub.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA=\ngithub.com/cloudwego/kitex v0.8.0 h1:eL6Xb2vnHfOjvDqmPsvCuheDo513lOc1HG6hSHGiFyM=\ngithub.com/cloudwego/kitex v0.8.0/go.mod h1:5o98nYKp8GwauvA1hhJwTA3YQcPa8Nu5tx+2j+JjwoM=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w=\ngithub.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.3 h1:dqdB5wXnw9icTXdb+/13dVZhSEf83UVsa75Yr05vTVE=\ngithub.com/cloudwego/thriftgo v0.3.3/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=\ngithub.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=\ngithub.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=\ngithub.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU=\ngithub.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=\ngithub.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM=\ngithub.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A=\ngithub.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0=\ngithub.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=\ngithub.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=\ngithub.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I=\ngithub.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=\ngithub.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=\ngithub.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=\ngithub.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=\ngithub.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=\ngithub.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=\ngithub.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3 h1:BvoAn9lMaQNkWLDrR1wTrQsnOoLbMuGgr994sAwZT8s=\ngithub.com/kitex-contrib/obs-opentelemetry/logging/logrus v0.0.0-20231211030816-1f9e0f7bcee3/go.mod h1:oQTDyY/+vIlKG/9FGhtYASfb+UybIiianqn1RLVhJ3A=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654 h1:mHprV3SyDeJtOJEUsVX3I0wrAsnK7Q+vBmJ+eZuQSJU=\ngithub.com/kitex-contrib/registry-consul v0.0.0-20230406075225-7d341f036654/go.mod h1:NR9ytGiooeJGatm/4/PpkW6mcAQI4h9Cf/ToOILHWuY=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=\ngithub.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=\ngithub.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=\ngithub.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=\ngithub.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=\ngithub.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=\ngithub.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=\ngithub.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=\ngithub.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE=\ngithub.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY=\ngithub.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=\ngo.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE=\ngo.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc=\ngo.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=\ngo.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=\ngo.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\ngo.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\ngo.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=\ngo.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=\ngo.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=\ngolang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg=\ngoogle.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=\ngoogle.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY=\ngopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=\ngorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=\ngorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\ngorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=\ngorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/handler.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/biz/service\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n)\n\n// EchoImpl implements the last service interface defined in the IDL.\ntype EchoImpl struct{}\n\n// Echo implements the EchoImpl interface.\nfunc (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {\n\tresp, err = service.NewEchoService(ctx).Run(req)\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/kitex_gen/api/echo/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tEcho(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEchoClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEchoClient struct {\n\t*kClient\n}\n\nfunc (p *kEchoClient) Echo(ctx context.Context, req *api.Request, callOptions ...callopt.Option) (r *api.Response, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Echo(ctx, req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/kitex_gen/api/echo/echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\t\"context\"\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn echoServiceInfo\n}\n\nvar echoServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"Echo\"\n\thandlerType := (*api.Echo)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"echo\": kitex.NewMethodInfo(echoHandler, newEchoEchoArgs, newEchoEchoResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"api\",\n\t\t\"ServiceFilePath\": `../../idl/echo.thrift`,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc echoHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*api.EchoEchoArgs)\n\trealResult := result.(*api.EchoEchoResult)\n\tsuccess, err := handler.(api.Echo).Echo(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newEchoEchoArgs() interface{} {\n\treturn api.NewEchoEchoArgs()\n}\n\nfunc newEchoEchoResult() interface{} {\n\treturn api.NewEchoEchoResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Echo(ctx context.Context, req *api.Request) (r *api.Response, err error) {\n\tvar _args api.EchoEchoArgs\n\t_args.Req = req\n\tvar _result api.EchoEchoResult\n\tif err = p.c.Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/kitex_gen/api/echo/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler api.Echo, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/kitex_gen/api/echo/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage echo\n\nimport (\n\tapi \"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler api.Echo, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/kitex_gen/api/echo.go",
    "content": "// Code generated by thriftgo (0.3.1). DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewRequest() *Request {\n\treturn &Request{}\n}\n\nfunc (p *Request) InitDefault() {\n\t*p = Request{}\n}\n\nfunc (p *Request) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Request) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Request = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Request) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Request) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Request\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Request) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Request) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Request(%+v)\", *p)\n}\n\nfunc (p *Request) DeepEqual(ano *Request) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Request) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Response struct {\n\tMessage string `thrift:\"message,1\" frugal:\"1,default,string\" json:\"message\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) InitDefault() {\n\t*p = Response{}\n}\n\nfunc (p *Response) GetMessage() (v string) {\n\treturn p.Message\n}\nfunc (p *Response) SetMessage(val string) {\n\tp.Message = val\n}\n\nvar fieldIDToName_Response = map[int16]string{\n\t1: \"message\",\n}\n\nfunc (p *Response) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Message = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"message\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Message); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n\nfunc (p *Response) DeepEqual(ano *Response) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Message) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *Response) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Message, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Echo interface {\n\tEcho(ctx context.Context, req *Request) (r *Response, err error)\n}\n\ntype EchoClient struct {\n\tc thrift.TClient\n}\n\nfunc NewEchoClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewEchoClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *EchoClient {\n\treturn &EchoClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewEchoClient(c thrift.TClient) *EchoClient {\n\treturn &EchoClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *EchoClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *EchoClient) Echo(ctx context.Context, req *Request) (r *Response, err error) {\n\tvar _args EchoEchoArgs\n\t_args.Req = req\n\tvar _result EchoEchoResult\n\tif err = p.Client_().Call(ctx, \"echo\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype EchoProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Echo\n}\n\nfunc (p *EchoProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *EchoProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *EchoProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewEchoProcessor(handler Echo) *EchoProcessor {\n\tself := &EchoProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"echo\", &echoProcessorEcho{handler: handler})\n\treturn self\n}\nfunc (p *EchoProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype echoProcessorEcho struct {\n\thandler Echo\n}\n\nfunc (p *echoProcessorEcho) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := EchoEchoArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := EchoEchoResult{}\n\tvar retval *Response\n\tif retval, err2 = p.handler.Echo(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing echo: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"echo\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"echo\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype EchoEchoArgs struct {\n\tReq *Request `thrift:\"req,1\" frugal:\"1,default,Request\" json:\"req\"`\n}\n\nfunc NewEchoEchoArgs() *EchoEchoArgs {\n\treturn &EchoEchoArgs{}\n}\n\nfunc (p *EchoEchoArgs) InitDefault() {\n\t*p = EchoEchoArgs{}\n}\n\nvar EchoEchoArgs_Req_DEFAULT *Request\n\nfunc (p *EchoEchoArgs) GetReq() (v *Request) {\n\tif !p.IsSetReq() {\n\t\treturn EchoEchoArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *EchoEchoArgs) SetReq(val *Request) {\n\tp.Req = val\n}\n\nvar fieldIDToName_EchoEchoArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *EchoEchoArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EchoEchoArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewRequest()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoArgs(%+v)\", *p)\n}\n\nfunc (p *EchoEchoArgs) DeepEqual(ano *EchoEchoArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoArgs) Field1DeepEqual(src *Request) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype EchoEchoResult struct {\n\tSuccess *Response `thrift:\"success,0,optional\" frugal:\"0,optional,Response\" json:\"success,omitempty\"`\n}\n\nfunc NewEchoEchoResult() *EchoEchoResult {\n\treturn &EchoEchoResult{}\n}\n\nfunc (p *EchoEchoResult) InitDefault() {\n\t*p = EchoEchoResult{}\n}\n\nvar EchoEchoResult_Success_DEFAULT *Response\n\nfunc (p *EchoEchoResult) GetSuccess() (v *Response) {\n\tif !p.IsSetSuccess() {\n\t\treturn EchoEchoResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *EchoEchoResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*Response)\n}\n\nvar fieldIDToName_EchoEchoResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *EchoEchoResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EchoEchoResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewResponse()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *EchoEchoResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"echo_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"EchoEchoResult(%+v)\", *p)\n}\n\nfunc (p *EchoEchoResult) DeepEqual(ano *EchoEchoResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *EchoEchoResult) Field0DeepEqual(src *Response) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/kitex_gen/api/k-consts.go",
    "content": "package api\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/kitex_gen/api/k-echo.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *Request) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Request[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Request) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Request) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Request) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Request\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Request\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Request) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Request) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *Response) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_Response[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *Response) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Message = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *Response) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *Response) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"Response\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"Response\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *Response) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"message\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Message)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *Response) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"message\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.Message)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewRequest()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_EchoEchoResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *EchoEchoResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewResponse()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *EchoEchoResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *EchoEchoResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"echo_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"echo_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *EchoEchoResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *EchoEchoResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *EchoEchoArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *EchoEchoResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/kitex_info.yaml",
    "content": "kitexinfo:\n  ServiceName: 'demo_thrift'\n  ToolVersion: 'v0.8.0'"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/conf\"\n\t\"github.com/cloudwego/biz-demo/gomall/demo/demo_thrift/kitex_gen/api/echo\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\tkitexlogrus \"github.com/kitex-contrib/obs-opentelemetry/logging/logrus\"\n\tconsul \"github.com/kitex-contrib/registry-consul\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nfunc main() {\n\topts := kitexInit()\n\n\tsvr := echo.NewServer(new(EchoImpl), opts...)\n\n\terr := svr.Run()\n\tif err != nil {\n\t\tklog.Error(err.Error())\n\t}\n}\n\nfunc kitexInit() (opts []server.Option) {\n\t// address\n\taddr, err := net.ResolveTCPAddr(\"tcp\", conf.GetConf().Kitex.Address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\topts = append(opts, server.WithServiceAddr(addr))\n\n\t// service info\n\topts = append(opts, server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{\n\t\tServiceName: conf.GetConf().Kitex.Service,\n\t}))\n\t// thrift meta handler\n\topts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))\n\n\tr, err := consul.NewConsulRegister(conf.GetConf().Registry.RegistryAddress[0])\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\topts = append(opts, server.WithRegistry(r))\n\n\t// klog\n\tlogger := kitexlogrus.NewLogger()\n\tklog.SetLogger(logger)\n\tklog.SetLevel(conf.LogLevel())\n\tasyncWriter := &zapcore.BufferedWriteSyncer{\n\t\tWS: zapcore.AddSync(&lumberjack.Logger{\n\t\t\tFilename:   conf.GetConf().Kitex.LogFileName,\n\t\t\tMaxSize:    conf.GetConf().Kitex.LogMaxSize,\n\t\t\tMaxBackups: conf.GetConf().Kitex.LogMaxBackups,\n\t\t\tMaxAge:     conf.GetConf().Kitex.LogMaxAge,\n\t\t}),\n\t\tFlushInterval: time.Minute,\n\t}\n\tklog.SetOutput(asyncWriter)\n\tserver.RegisterShutdownHook(func() {\n\t\t_ = asyncWriter.Sync()\n\t})\n\treturn\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/readme.md",
    "content": "# *** Project\n\n## introduce\n\n- Use the [Kitex](https://github.com/cloudwego/kitex/) framework\n- Generating the base code for unit tests.\n- Provides basic config functions\n- Provides the most basic MVC code hierarchy.\n\n## Directory structure\n\n|  catalog   | introduce  |\n|  ----  | ----  |\n| conf  | Configuration files |\n| main.go  | Startup file |\n| handler.go  | Used for request processing return of response. |\n| kitex_gen  | kitex generated code |\n| biz/service  | The actual business logic. |\n| biz/dal  | Logic for operating the storage layer |\n\n## How to run\n\n```shell\nsh build.sh\nsh output/bootstrap.sh\n```"
  },
  {
    "path": "gomall/tutorial/ch17/demo/demo_thrift/script/bootstrap.sh",
    "content": "#! /usr/bin/env bash\nCURDIR=$(cd $(dirname $0); pwd)\necho \"$CURDIR/bin/demo_thrift\"\nexec \"$CURDIR/bin/demo_thrift\""
  },
  {
    "path": "gomall/tutorial/ch17/deploy/Dockerfile",
    "content": "FROM golang:alpine\n\nWORKDIR /opt/go\n\nCOPY . /opt/go\n\nENV GOPROXY=https://goproxy.cn\n\nRUN go build -o app .\n\nFROM alpine:latest\n\nENV GO_ENV=online\n\nRUN set sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \\\n    apk --no-cache add ca-certificates\n\nWORKDIR /opt/go\n\nCOPY --from=0 /opt/go/app ./\nCOPY conf /opt/go/conf\n\nCMD [\"./app\"]\n\n"
  },
  {
    "path": "gomall/tutorial/ch17/deploy/config/prometheus.yml",
    "content": "global:\n  scrape_interval: 15s\n\nscrape_configs:\n  - job_name: \"consul\"\n    consul_sd_configs:\n      - server: consul:8500\n        services:\n          - prometheus\n    relabel_configs:\n      - source_labels: [ __meta_consul_tags ]\n        action: replace\n        target_label: service\n        regex: \".*service:(.*?),.*\"\n        replacement: \"$1\"\n\n      - source_labels: [ __meta_consul_service_id ]\n        target_label: __metrics_path__\n        replacement: /metrics\n"
  },
  {
    "path": "gomall/tutorial/ch17/docker-compose.yaml",
    "content": "version: \"3\"\nservices:\n  consul:\n    image: \"consul:1.15.4\"\n    ports:\n      - \"8500:8500\"\n  mysql:\n    image: \"mysql:latest\"\n    ports:\n      - 3306:3306\n    environment:\n      - MYSQL_ROOT_PASSWORD=root\n    volumes:\n      - ./db/sql/ini:/docker-entrypoint-initdb.d\n  redis:\n    image: \"redis:latest\"\n    ports:\n      - 6379:6379\n  nats:\n    image: nats:latest\n    ports:\n      - \"4222:4222\"\n      - \"8222:8222\"\n  # Jaeger\n  jaeger-all-in-one:\n    image: jaegertracing/all-in-one:latest\n    ports:\n      - \"16686:16686\"\n      - \"4317:4317\"\n      - \"4318:4318\"\n  prometheus:\n    image: prom/prometheus:latest\n    volumes:\n      - ./deploy/config/prometheus.yml:/etc/prometheus/prometheus.yml\n    command:\n      - \"--config.file=/etc/prometheus/prometheus.yml\"\n    ports:\n      - \"9090:9090\"\n"
  },
  {
    "path": "gomall/tutorial/ch17/go.work",
    "content": "go 1.23.0\n\ntoolchain go1.23.11\n\nuse (\n\t./app/cart\n\t./app/checkout\n\t./app/email\n\t./app/frontend\n\t./app/order\n\t./app/payment\n\t./app/product\n\t./app/user\n\t./common\n\t./demo/demo_proto\n\t./demo/demo_thrift\n\t./hello_world\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/hello_world/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/hello_world\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nrequire github.com/cloudwego/hertz v0.7.3\n\nrequire (\n\tgithub.com/andeya/ameda v1.5.3 // indirect\n\tgithub.com/andeya/goutil v1.0.1 // indirect\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.11 // indirect\n\tgithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 // indirect\n\tgithub.com/bytedance/mockey v1.2.7 // indirect\n\tgithub.com/bytedance/sonic v1.10.2 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect\n\tgithub.com/chenzhuoyu/iasm v0.9.1 // indirect\n\tgithub.com/cloudwego/netpoll v0.5.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fsnotify/fsnotify v1.7.0 // indirect\n\tgithub.com/google/go-cmp v0.6.0 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.6 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.3.0 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/tidwall/gjson v1.17.0 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.6.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/hello_world/go.sum",
    "content": "github.com/andeya/ameda v1.5.3 h1:SvqnhQPZwwabS8HQTRGfJwWPl2w9ZIPInHAw9aE1Wlk=\ngithub.com/andeya/ameda v1.5.3/go.mod h1:FQDHRe1I995v6GG+8aJ7UIUToEmbdTJn/U26NCPIgXQ=\ngithub.com/andeya/goutil v1.0.1 h1:eiYwVyAnnK0dXU5FJsNjExkJW4exUGn/xefPt3k4eXg=\ngithub.com/andeya/goutil v1.0.1/go.mod h1:jEG5/QnnhG7yGxwFUX6Q+JGMif7sjdHmmNVjn7nhJDo=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11 h1:jJgmoDKPKacGl0llPYbYL/+/2N+Ng0vV0ipbnVssXHY=\ngithub.com/bytedance/go-tagexpr/v2 v2.9.11/go.mod h1:UAyKh4ZRLBPGsyTRFZoPqTni1TlojMdOJXQnEIPCX84=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960 h1:t2xAuIlnhWJDIpcHZEbpoVsQH1hOk9eGGaKU2dXl1PE=\ngithub.com/bytedance/gopkg v0.0.0-20231219111115-a5eedbe96960/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o=\ngithub.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=\ngithub.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=\ngithub.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=\ngithub.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=\ngithub.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=\ngithub.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/cloudwego/hertz v0.7.3 h1:VM1DxditA6vxI97rG5SBu4hHB24xdzDbKBQfUy7sfVE=\ngithub.com/cloudwego/hertz v0.7.3/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=\ngithub.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.5.1 h1:zDUF7xF0C97I10fGlQFJ4jg65khZZMUvSu/TWX44Ohc=\ngithub.com/cloudwego/netpoll v0.5.1/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=\ngithub.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=\ngithub.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=\ngithub.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/nyaruka/phonenumbers v1.3.0 h1:IFyyJfF2Elg8xGKFghWrRXzb6qAHk+Q3uPqmIgS20JQ=\ngithub.com/nyaruka/phonenumbers v1.3.0/go.mod h1:4jyKp/BFUokLbCHyoZag+T3S1KezFVoEKtgnbpzItC4=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=\ngithub.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=\ngolang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "gomall/tutorial/ch17/hello_world/main.go",
    "content": "// Copyright 2024 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/protocol/consts\"\n)\n\nfunc main() {\n\th := server.Default()\n\th.GET(\"/hello\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.Data(consts.StatusOK, consts.MIMETextPlain, []byte(\"hello world\"))\n\t})\n\th.Spin()\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/idl/api.proto",
    "content": "syntax = \"proto3\";\n\npackage api;\n\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"/api\";\n\nextend google.protobuf.FieldOptions {\n  optional string raw_body = 50101;\n  optional string query = 50102;\n  optional string header = 50103;\n  optional string cookie = 50104;\n  optional string body = 50105;\n  optional string path = 50106;\n  optional string vd = 50107;\n  optional string form = 50108;\n  optional string js_conv = 50109;\n  optional string file_name = 50110;\n  optional string none = 50111;\n\n  // 50131~50160 used to extend field option by hz\n  optional string form_compatible = 50131;\n  optional string js_conv_compatible = 50132;\n  optional string file_name_compatible = 50133;\n  optional string none_compatible = 50134;\n  // 50135 is reserved to vt_compatible\n  // optional FieldRules vt_compatible = 50135;\n\n  optional string go_tag = 51001;\n}\n\nextend google.protobuf.MethodOptions {\n  optional string get = 50201;\n  optional string post = 50202;\n  optional string put = 50203;\n  optional string delete = 50204;\n  optional string patch = 50205;\n  optional string options = 50206;\n  optional string head = 50207;\n  optional string any = 50208;\n  optional string gen_path =\n      50301; // The path specified by the user when the client code is\n             // generated, with a higher priority than api_version\n  optional string api_version =\n      50302; // Specify the value of the :version variable in path when the\n             // client code is generated\n  optional string tag = 50303;  // rpc tag, can be multiple, separated by commas\n  optional string name = 50304; // Name of rpc\n  optional string api_level = 50305;  // Interface Level\n  optional string serializer = 50306; // Serialization method\n  optional string param =\n      50307; // Whether client requests take public parameters\n  optional string baseurl = 50308; // Baseurl used in ttnet routing\n  optional string handler_path =\n      50309; // handler_path specifies the path to generate the method\n\n  // 50331~50360 used to extend method option by hz\n  optional string handler_path_compatible =\n      50331; // handler_path specifies the path to generate the method\n}\n\nextend google.protobuf.EnumValueOptions {\n  optional int32 http_code = 50401;\n\n  // 50431~50460 used to extend enum option by hz\n}\n\nextend google.protobuf.ServiceOptions {\n  optional string base_domain = 50402;\n\n  // 50731~50760 used to extend service option by hz\n  optional string base_domain_compatible = 50731;\n  optional string service_path = 50732;\n}\n\nextend google.protobuf.MessageOptions {\n  // optional FieldRules msg_vt = 50111;\n\n  optional string reserve = 50830;\n  // 550831 is reserved to msg_vt_compatible\n  // optional FieldRules msg_vt_compatible = 50831;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/idl/cart.proto",
    "content": "syntax = \"proto3\";\n\npackage cart;\n\noption go_package = '/cart';\n\nservice CartService {\n  rpc AddItem(AddItemReq) returns (AddItemResp) {}\n  rpc GetCart(GetCartReq) returns (GetCartResp) {}\n  rpc EmptyCart(EmptyCartReq) returns (EmptyCartResp) {}\n}\n\nmessage CartItem {\n  uint32 product_id = 1;\n  int32  quantity = 2;\n}\n\nmessage AddItemReq {\n  uint32 user_id = 1;\n  CartItem item = 2;\n}\n\nmessage AddItemResp {}\n\nmessage EmptyCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartReq {\n  uint32 user_id = 1;\n}\n\nmessage GetCartResp {\n  Cart cart = 1;\n}\n\nmessage Cart {\n  uint32 user_id = 1;\n  repeated CartItem items = 2;\n}\n\nmessage EmptyCartResp {}\n"
  },
  {
    "path": "gomall/tutorial/ch17/idl/checkout.proto",
    "content": "syntax = \"proto3\";\n\npackage  checkout;\n\nimport \"payment.proto\";\n\noption go_package = \"/checkout\";\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (CheckoutResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  string zip_code = 5;\n}\n\nmessage CheckoutReq {\n  uint32 user_id = 1;\n  string firstname = 2;\n  string lastname = 3;\n  string email = 4;\n  Address address = 5;\n  payment.CreditCardInfo credit_card = 6;\n}\n\nmessage CheckoutResp {\n  string order_id = 1;\n  string transaction_id = 2;\n}"
  },
  {
    "path": "gomall/tutorial/ch17/idl/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage pbapi;\n\noption go_package = \"/pbapi\";\n\nmessage Request {\n  string message = 1;\n}\n\nmessage Response {\n  string message = 1;\n}\n\nservice Echo {\n  rpc Echo (Request) returns (Response) {}\n}"
  },
  {
    "path": "gomall/tutorial/ch17/idl/echo.thrift",
    "content": "namespace go api\n\nstruct Request {\n        1: string message\n}\n\nstruct Response {\n        1: string message\n}\n\nservice Echo {\n    Response echo(1: Request req)\n}"
  },
  {
    "path": "gomall/tutorial/ch17/idl/email.proto",
    "content": "syntax = \"proto3\";\n\npackage email;\n\noption go_package = \"/email\";\n\nmessage EmailReq{\n  string from = 1;\n  string to = 2;\n  string content_type = 3;\n  string subject = 4;\n  string content = 5;\n}\n\nmessage EmailResp {\n\n}\n\nservice EmailService{\n  rpc Send(EmailReq) returns (EmailResp);\n}"
  },
  {
    "path": "gomall/tutorial/ch17/idl/frontend/auth_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.auth;\n\noption go_package = \"/frontend/auth\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage RegisterReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string confirm_password = 3 [(api.form) = \"confirm_password\"];\n}\n\nmessage LoginReq {\n  string email = 1 [(api.form) = \"email\"];\n  string password = 2 [(api.form) = \"password\"];\n  string next = 3 [(api.query) = \"next\"];\n}\n\nservice AuthService {\n  rpc register(RegisterReq) returns (common.Empty) {\n    option (api.post) = \"/auth/register\";\n  }\n  rpc login(LoginReq) returns (common.Empty) {\n    option (api.post) = \"/auth/login\";\n  }\n  rpc logout(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/auth/logout\";\n  }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/idl/frontend/cart_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.cart;\n\noption go_package = \"/frontend/cart\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage AddCartReq {\n  uint32 product_id = 1 [(api.form) = \"productId\"];\n  int32 product_num = 2 [(api.form) = \"productNum\"];\n}\n\nservice CartService {\n  rpc AddCartItem(AddCartReq) returns (common.Empty) {\n    option (api.post) = \"/cart\";\n  }\n  rpc GetCart(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/cart\";\n  }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/idl/frontend/category_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.category;\n\noption go_package = \"/frontend/category\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CategoryReq { string category = 1 [(api.path)=\"category\"]; }\n\nservice CategoryService {\n  rpc Category(CategoryReq) returns (common.Empty) {\n    option (api.get) = \"/category/:category\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch17/idl/frontend/checkout_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.checkout;\n\noption go_package = \"/frontend/checkout\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nmessage CheckoutReq {\n  string email = 1 [(api.form) = \"email\"];\n  string firstname = 2 [(api.form) = \"firstname\"];\n  string lastname = 3 [(api.form) = \"lastname\"];\n  string street = 4 [(api.form) = \"street\"];\n  string zipcode = 5 [(api.form) = \"zipcode\"];\n  string province = 6 [(api.form) = \"province\"];\n  string country = 7 [(api.form) = \"country\"];\n  string city = 8 [(api.form) = \"city\"];\n  string card_num = 9 [(api.form) = \"cardNum\"];\n  int32 expiration_month = 10 [(api.form) = \"expirationMonth\"];\n  int32 expiration_year = 11 [(api.form) = \"expirationYear\"];\n  int32 cvv = 12 [(api.form) = \"cvv\"];\n  string payment = 13 [(api.form) = \"payment\"];\n}\n\nservice CheckoutService {\n  rpc Checkout(CheckoutReq) returns (common.Empty) {\n    option (api.get) = \"/checkout\";\n  }\n  rpc CheckoutWaiting(common.Empty) returns (common.Empty) {\n    option (api.post) = \"/checkout/waiting\";\n  }\n  rpc CheckoutResult(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/checkout/result\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch17/idl/frontend/common.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.common;\n\noption go_package = \"frontend/common\";\n\nmessage Empty {}"
  },
  {
    "path": "gomall/tutorial/ch17/idl/frontend/home.proto",
    "content": "syntax = 'proto3';\n\npackage frontend.common;\n\nimport \"api.proto\";\nimport \"frontend/common.proto\";\n\noption go_package = \"frontend/home\";\n\nservice HomeService {\n  rpc Home(common.Empty) returns (Empty) { option (api.get) = \"/\"; }\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/idl/frontend/order_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.order;\n\noption go_package = \"/frontend/order\";\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\nservice OrderService {\n  rpc OrderList(common.Empty) returns (common.Empty) {\n    option (api.get) = \"/order\";\n  }\n}"
  },
  {
    "path": "gomall/tutorial/ch17/idl/frontend/product_page.proto",
    "content": "syntax = \"proto3\";\n\npackage frontend.product;\n\nimport \"frontend/common.proto\";\nimport \"api.proto\";\n\noption go_package = \"frontend/product\";\n\nmessage ProductReq { uint32 id = 1 [ (api.query) = \"id\" ]; }\n\nservice ProductService {\n  rpc GetProduct(ProductReq) returns (common.Empty) {\n    option (api.get) = \"/product\";\n  };\n}"
  },
  {
    "path": "gomall/tutorial/ch17/idl/order.proto",
    "content": "syntax = \"proto3\";\n\npackage order;\n\nimport \"cart.proto\";\n\noption go_package = \"order\";\n\nservice OrderService {\n  rpc PlaceOrder(PlaceOrderReq) returns (PlaceOrderResp) {}\n  rpc ListOrder(ListOrderReq) returns (ListOrderResp) {}\n}\n\nmessage Address {\n  string street_address = 1;\n  string city = 2;\n  string state = 3;\n  string country = 4;\n  int32 zip_code = 5;\n}\n\nmessage PlaceOrderReq {\n  uint32 user_id = 1;\n  string user_currency = 2;\n\n  Address address = 3;\n  string email = 4;\n  repeated OrderItem order_items = 5;\n}\n\nmessage OrderItem {\n  cart.CartItem item = 1;\n  float cost = 2;\n}\n\nmessage OrderResult {\n  string order_id = 1;\n}\n\nmessage PlaceOrderResp {\n  OrderResult order = 1;\n}\n\nmessage ListOrderReq {\n  uint32 user_id = 1;\n}\n\nmessage Order {\n  repeated OrderItem order_items = 1;\n  string order_id = 2;\n  uint32 user_id = 3;\n  string user_currency = 4;\n  Address address = 5;\n  string email = 6;\n  int32 created_at = 7;\n}\n\nmessage ListOrderResp {\n  repeated Order orders = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/idl/payment.proto",
    "content": "syntax = \"proto3\";\n\npackage payment;\n\noption go_package = \"payment\";\n\n\nservice PaymentService {\n  rpc Charge(ChargeReq) returns (ChargeResp) {}\n}\n\nmessage CreditCardInfo {\n  string credit_card_number = 1;\n  int32 credit_card_cvv = 2;\n  int32 credit_card_expiration_year = 3;\n  int32 credit_card_expiration_month = 4;\n}\n\nmessage ChargeReq {\n  float amount = 1;\n  CreditCardInfo credit_card = 2;\n  string order_id = 3;\n  uint32 user_id = 4;\n}\n\nmessage ChargeResp {\n  string transaction_id = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/idl/product.proto",
    "content": "syntax = \"proto3\";\n\npackage product;\n\noption go_package = \"/product\";\n\nservice ProductCatalogService {\n  rpc ListProducts(ListProductsReq) returns (ListProductsResp) {}\n  rpc GetProduct(GetProductReq) returns (GetProductResp) {}\n  rpc SearchProducts(SearchProductsReq) returns (SearchProductsResp) {}\n}\n\nmessage ListProductsReq{\n  int32 page = 1;\n  int64 pageSize = 2;\n\n  string categoryName = 3;\n}\n\nmessage Product {\n  uint32 id = 1;\n  string name = 2;\n  string description = 3;\n  string picture = 4;\n  float price = 5;\n\n  repeated string categories = 6;\n}\n\nmessage ListProductsResp {\n  repeated Product products = 1;\n}\n\nmessage GetProductReq {\n  uint32 id = 1;\n}\n\nmessage GetProductResp {\n  Product product = 1;\n}\n\nmessage SearchProductsReq {\n  string query = 1;\n}\n\nmessage SearchProductsResp {\n  repeated Product results = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/idl/user.proto",
    "content": "syntax=\"proto3\";\n\npackage user;\n\noption go_package=\"/user\";\n\nservice UserService {\n    rpc Register(RegisterReq) returns (RegisterResp) {}\n    rpc Login(LoginReq) returns (LoginResp) {}\n}\n\nmessage RegisterReq {\n    string email = 1;\n    string password = 2;\n    string confirm_password = 3;\n}\n\nmessage RegisterResp {\n    int32 user_id = 1;\n}\n\nmessage LoginReq {\n    string email= 1;\n    string password = 2;\n}\n\nmessage LoginResp {\n    int32 user_id = 1;\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/go.mod",
    "content": "module github.com/cloudwego/biz-demo/gomall/rpc_gen\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tgithub.com/cloudwego/fastpb v0.0.5\n\tgithub.com/cloudwego/kitex v0.14.1\n\tgoogle.golang.org/protobuf v1.36.6\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.2 // indirect\n\tgithub.com/bytedance/sonic v1.13.3 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.3 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.6.4 // indirect\n\tgithub.com/cloudwego/frugal v0.2.5 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.5 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.1.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.7.1 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.1 // indirect\n\tgithub.com/cloudwego/thriftgo v0.4.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.9 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgolang.org/x/arch v0.14.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ=\ngithub.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=\ngithub.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=\ngithub.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=\ngithub.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.3 h1:P0YTBgqDBnKeI/VARvut/Dc9Rfxt9Bw1Nv7sk0Ru4u8=\ngithub.com/cloudwego/configmanager v0.2.3/go.mod h1:4GeSKjH6JLvKx4/Hrbh5dse8fDqj1n/Up8HfU4wHJ+w=\ngithub.com/cloudwego/dynamicgo v0.6.4 h1:OgZ1Q0u8dlU6N+nxwrt4YOX7pXw3jTluICBWMlc7mFU=\ngithub.com/cloudwego/dynamicgo v0.6.4/go.mod h1:ZfuIc4tsk8gdsmsoL+3M/q3916xTj+KAVJaXQHSaWiE=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.2.5 h1:zRICkWpBCQ6TY4QmRf+uINzcHbv7ogCHOM8h7ltPRzM=\ngithub.com/cloudwego/frugal v0.2.5/go.mod h1:nC1U47gswLRiaxv6dybrhZvsDGCfQP9RGiiWC73CnoI=\ngithub.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/gopkg v0.1.5 h1:wxzw/EFtuK61sp5dR6eb9FRv72wZuQZz+AUUWBMHKn8=\ngithub.com/cloudwego/gopkg v0.1.5/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.14.1 h1:YXCCBHBKjSQtxLvzr2g57MRJoadzQBKvdt6rMXucb7g=\ngithub.com/cloudwego/kitex v0.14.1/go.mod h1:77rlwbBSAHd6raOe/LI9/B+kMINsXd52b6A5YMeEye8=\ngithub.com/cloudwego/localsession v0.1.2 h1:RBmeLDO5sKr4ujd8iBp5LTMmuVKLdu88jjIneq/fEZ8=\ngithub.com/cloudwego/localsession v0.1.2/go.mod h1:J4uams2YT/2d4t7OI6A7NF7EcG8OlHJsOX2LdPbqoyc=\ngithub.com/cloudwego/netpoll v0.7.1 h1://3rtQV/auOCsqHn9XrXwYJhSgAS+5zSBPpYPm5vydY=\ngithub.com/cloudwego/netpoll v0.7.1/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU=\ngithub.com/cloudwego/runtimex v0.1.1 h1:lheZjFOyKpsq8TsGGfmX9/4O7F0TKpWmB8on83k7GE8=\ngithub.com/cloudwego/runtimex v0.1.1/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=\ngithub.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=\ngithub.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=\ngolang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/cart/cart.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage cart\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CartItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CartItem[number], err)\n}\n\nfunc (x *CartItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.ProductId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CartItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Quantity, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_AddItemReq[number], err)\n}\n\nfunc (x *AddItemReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *AddItemReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *AddItemResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmptyCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmptyCartReq[number], err)\n}\n\nfunc (x *EmptyCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartReq[number], err)\n}\n\nfunc (x *GetCartReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetCartResp[number], err)\n}\n\nfunc (x *GetCartResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Cart\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Cart = &v\n\treturn offset, nil\n}\n\nfunc (x *Cart) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Cart[number], err)\n}\n\nfunc (x *Cart) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Cart) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Items = append(x.Items, &v)\n\treturn offset, nil\n}\n\nfunc (x *EmptyCartResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *CartItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.ProductId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetProductId())\n\treturn offset\n}\n\nfunc (x *CartItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Quantity == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetQuantity())\n\treturn offset\n}\n\nfunc (x *AddItemReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *AddItemReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItem())\n\treturn offset\n}\n\nfunc (x *AddItemResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmptyCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *GetCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetCartResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Cart == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetCart())\n\treturn offset\n}\n\nfunc (x *Cart) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Cart) fastWriteField2(buf []byte) (offset int) {\n\tif x.Items == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *EmptyCartResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *CartItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CartItem) sizeField1() (n int) {\n\tif x.ProductId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetProductId())\n\treturn n\n}\n\nfunc (x *CartItem) sizeField2() (n int) {\n\tif x.Quantity == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetQuantity())\n\treturn n\n}\n\nfunc (x *AddItemReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *AddItemReq) sizeField2() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetItem())\n\treturn n\n}\n\nfunc (x *AddItemResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *EmptyCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *GetCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetCartResp) sizeField1() (n int) {\n\tif x.Cart == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetCart())\n\treturn n\n}\n\nfunc (x *Cart) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *Cart) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Cart) sizeField2() (n int) {\n\tif x.Items == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetItems() {\n\t\tn += fastpb.SizeMessage(2, x.GetItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *EmptyCartResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_CartItem = map[int32]string{\n\t1: \"ProductId\",\n\t2: \"Quantity\",\n}\n\nvar fieldIDToName_AddItemReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Item\",\n}\n\nvar fieldIDToName_AddItemResp = map[int32]string{}\n\nvar fieldIDToName_EmptyCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_GetCartResp = map[int32]string{\n\t1: \"Cart\",\n}\n\nvar fieldIDToName_Cart = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Items\",\n}\n\nvar fieldIDToName_EmptyCartResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/cart/cart.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: cart.proto\n\npackage cart\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CartItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProductId uint32 `protobuf:\"varint,1,opt,name=product_id,json=productId,proto3\" json:\"product_id,omitempty\"`\n\tQuantity  int32  `protobuf:\"varint,2,opt,name=quantity,proto3\" json:\"quantity,omitempty\"`\n}\n\nfunc (x *CartItem) Reset() {\n\t*x = CartItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CartItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CartItem) ProtoMessage() {}\n\nfunc (x *CartItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CartItem.ProtoReflect.Descriptor instead.\nfunc (*CartItem) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CartItem) GetProductId() uint32 {\n\tif x != nil {\n\t\treturn x.ProductId\n\t}\n\treturn 0\n}\n\nfunc (x *CartItem) GetQuantity() int32 {\n\tif x != nil {\n\t\treturn x.Quantity\n\t}\n\treturn 0\n}\n\ntype AddItemReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32    `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItem   *CartItem `protobuf:\"bytes,2,opt,name=item,proto3\" json:\"item,omitempty\"`\n}\n\nfunc (x *AddItemReq) Reset() {\n\t*x = AddItemReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemReq) ProtoMessage() {}\n\nfunc (x *AddItemReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemReq.ProtoReflect.Descriptor instead.\nfunc (*AddItemReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *AddItemReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *AddItemReq) GetItem() *CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\ntype AddItemResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *AddItemResp) Reset() {\n\t*x = AddItemResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AddItemResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AddItemResp) ProtoMessage() {}\n\nfunc (x *AddItemResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AddItemResp.ProtoReflect.Descriptor instead.\nfunc (*AddItemResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{2}\n}\n\ntype EmptyCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *EmptyCartReq) Reset() {\n\t*x = EmptyCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartReq) ProtoMessage() {}\n\nfunc (x *EmptyCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartReq.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EmptyCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *GetCartReq) Reset() {\n\t*x = GetCartReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartReq) ProtoMessage() {}\n\nfunc (x *GetCartReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartReq.ProtoReflect.Descriptor instead.\nfunc (*GetCartReq) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetCartReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype GetCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCart *Cart `protobuf:\"bytes,1,opt,name=cart,proto3\" json:\"cart,omitempty\"`\n}\n\nfunc (x *GetCartResp) Reset() {\n\t*x = GetCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetCartResp) ProtoMessage() {}\n\nfunc (x *GetCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetCartResp.ProtoReflect.Descriptor instead.\nfunc (*GetCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *GetCartResp) GetCart() *Cart {\n\tif x != nil {\n\t\treturn x.Cart\n\t}\n\treturn nil\n}\n\ntype Cart struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32      `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tItems  []*CartItem `protobuf:\"bytes,2,rep,name=items,proto3\" json:\"items,omitempty\"`\n}\n\nfunc (x *Cart) Reset() {\n\t*x = Cart{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Cart) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Cart) ProtoMessage() {}\n\nfunc (x *Cart) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Cart.ProtoReflect.Descriptor instead.\nfunc (*Cart) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Cart) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Cart) GetItems() []*CartItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\ntype EmptyCartResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmptyCartResp) Reset() {\n\t*x = EmptyCartResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cart_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmptyCartResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmptyCartResp) ProtoMessage() {}\n\nfunc (x *EmptyCartResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_cart_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmptyCartResp.ProtoReflect.Descriptor instead.\nfunc (*EmptyCartResp) Descriptor() ([]byte, []int) {\n\treturn file_cart_proto_rawDescGZIP(), []int{7}\n}\n\nvar File_cart_proto protoreflect.FileDescriptor\n\nvar file_cart_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x08, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0a, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,\n\t0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,\n\t0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04,\n\t0x69, 0x74, 0x65, 0x6d, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52,\n\t0x65, 0x73, 0x70, 0x22, 0x27, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x25, 0x0a, 0x0a,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x1e, 0x0a, 0x04, 0x63, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x52, 0x04, 0x63, 0x61,\n\t0x72, 0x74, 0x22, 0x45, 0x0a, 0x04, 0x43, 0x61, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65,\n\t0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74,\n\t0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x45, 0x6d, 0x70,\n\t0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x32, 0xa9, 0x01, 0x0a, 0x0b, 0x43,\n\t0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x64, 0x64,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x41,\n\t0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x10, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x47,\n\t0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x61, 0x72, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36,\n\t0x0a, 0x09, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x12, 0x12, 0x2e, 0x63, 0x61,\n\t0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a,\n\t0x13, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x43, 0x61, 0x72, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62,\n\t0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72,\n\t0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e,\n\t0x2f, 0x63, 0x61, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cart_proto_rawDescOnce sync.Once\n\tfile_cart_proto_rawDescData = file_cart_proto_rawDesc\n)\n\nfunc file_cart_proto_rawDescGZIP() []byte {\n\tfile_cart_proto_rawDescOnce.Do(func() {\n\t\tfile_cart_proto_rawDescData = protoimpl.X.CompressGZIP(file_cart_proto_rawDescData)\n\t})\n\treturn file_cart_proto_rawDescData\n}\n\nvar file_cart_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_cart_proto_goTypes = []interface{}{\n\t(*CartItem)(nil),      // 0: cart.CartItem\n\t(*AddItemReq)(nil),    // 1: cart.AddItemReq\n\t(*AddItemResp)(nil),   // 2: cart.AddItemResp\n\t(*EmptyCartReq)(nil),  // 3: cart.EmptyCartReq\n\t(*GetCartReq)(nil),    // 4: cart.GetCartReq\n\t(*GetCartResp)(nil),   // 5: cart.GetCartResp\n\t(*Cart)(nil),          // 6: cart.Cart\n\t(*EmptyCartResp)(nil), // 7: cart.EmptyCartResp\n}\nvar file_cart_proto_depIdxs = []int32{\n\t0, // 0: cart.AddItemReq.item:type_name -> cart.CartItem\n\t6, // 1: cart.GetCartResp.cart:type_name -> cart.Cart\n\t0, // 2: cart.Cart.items:type_name -> cart.CartItem\n\t1, // 3: cart.CartService.AddItem:input_type -> cart.AddItemReq\n\t4, // 4: cart.CartService.GetCart:input_type -> cart.GetCartReq\n\t3, // 5: cart.CartService.EmptyCart:input_type -> cart.EmptyCartReq\n\t2, // 6: cart.CartService.AddItem:output_type -> cart.AddItemResp\n\t5, // 7: cart.CartService.GetCart:output_type -> cart.GetCartResp\n\t7, // 8: cart.CartService.EmptyCart:output_type -> cart.EmptyCartResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_cart_proto_init() }\nfunc file_cart_proto_init() {\n\tif File_cart_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CartItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AddItemResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Cart); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cart_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmptyCartResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cart_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_cart_proto_goTypes,\n\t\tDependencyIndexes: file_cart_proto_depIdxs,\n\t\tMessageInfos:      file_cart_proto_msgTypes,\n\t}.Build()\n\tFile_cart_proto = out.File\n\tfile_cart_proto_rawDesc = nil\n\tfile_cart_proto_goTypes = nil\n\tfile_cart_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CartService interface {\n\tAddItem(ctx context.Context, req *AddItemReq) (res *AddItemResp, err error)\n\tGetCart(ctx context.Context, req *GetCartReq) (res *GetCartResp, err error)\n\tEmptyCart(ctx context.Context, req *EmptyCartReq) (res *EmptyCartResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/cart/cartservice/cartservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn cartServiceServiceInfo\n}\n\nvar cartServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CartService\"\n\thandlerType := (*cart.CartService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"AddItem\":   kitex.NewMethodInfo(addItemHandler, newAddItemArgs, newAddItemResult, false),\n\t\t\"GetCart\":   kitex.NewMethodInfo(getCartHandler, newGetCartArgs, newGetCartResult, false),\n\t\t\"EmptyCart\": kitex.NewMethodInfo(emptyCartHandler, newEmptyCartArgs, newEmptyCartResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"cart\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc addItemHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.AddItemReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).AddItem(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *AddItemArgs:\n\t\tsuccess, err := handler.(cart.CartService).AddItem(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*AddItemResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newAddItemArgs() interface{} {\n\treturn &AddItemArgs{}\n}\n\nfunc newAddItemResult() interface{} {\n\treturn &AddItemResult{}\n}\n\ntype AddItemArgs struct {\n\tReq *cart.AddItemReq\n}\n\nfunc (p *AddItemArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.AddItemReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *AddItemArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *AddItemArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *AddItemArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar AddItemArgs_Req_DEFAULT *cart.AddItemReq\n\nfunc (p *AddItemArgs) GetReq() *cart.AddItemReq {\n\tif !p.IsSetReq() {\n\t\treturn AddItemArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *AddItemArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *AddItemArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype AddItemResult struct {\n\tSuccess *cart.AddItemResp\n}\n\nvar AddItemResult_Success_DEFAULT *cart.AddItemResp\n\nfunc (p *AddItemResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.AddItemResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *AddItemResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *AddItemResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *AddItemResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *AddItemResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.AddItemResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *AddItemResult) GetSuccess() *cart.AddItemResp {\n\tif !p.IsSetSuccess() {\n\t\treturn AddItemResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *AddItemResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.AddItemResp)\n}\n\nfunc (p *AddItemResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *AddItemResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.GetCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).GetCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).GetCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetCartArgs() interface{} {\n\treturn &GetCartArgs{}\n}\n\nfunc newGetCartResult() interface{} {\n\treturn &GetCartResult{}\n}\n\ntype GetCartArgs struct {\n\tReq *cart.GetCartReq\n}\n\nfunc (p *GetCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.GetCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetCartArgs_Req_DEFAULT *cart.GetCartReq\n\nfunc (p *GetCartArgs) GetReq() *cart.GetCartReq {\n\tif !p.IsSetReq() {\n\t\treturn GetCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetCartResult struct {\n\tSuccess *cart.GetCartResp\n}\n\nvar GetCartResult_Success_DEFAULT *cart.GetCartResp\n\nfunc (p *GetCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.GetCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.GetCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetCartResult) GetSuccess() *cart.GetCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.GetCartResp)\n}\n\nfunc (p *GetCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc emptyCartHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(cart.EmptyCartReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(cart.CartService).EmptyCart(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *EmptyCartArgs:\n\t\tsuccess, err := handler.(cart.CartService).EmptyCart(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*EmptyCartResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newEmptyCartArgs() interface{} {\n\treturn &EmptyCartArgs{}\n}\n\nfunc newEmptyCartResult() interface{} {\n\treturn &EmptyCartResult{}\n}\n\ntype EmptyCartArgs struct {\n\tReq *cart.EmptyCartReq\n}\n\nfunc (p *EmptyCartArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(cart.EmptyCartReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *EmptyCartArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *EmptyCartArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *EmptyCartArgs) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar EmptyCartArgs_Req_DEFAULT *cart.EmptyCartReq\n\nfunc (p *EmptyCartArgs) GetReq() *cart.EmptyCartReq {\n\tif !p.IsSetReq() {\n\t\treturn EmptyCartArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *EmptyCartArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *EmptyCartArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype EmptyCartResult struct {\n\tSuccess *cart.EmptyCartResp\n}\n\nvar EmptyCartResult_Success_DEFAULT *cart.EmptyCartResp\n\nfunc (p *EmptyCartResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(cart.EmptyCartResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *EmptyCartResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *EmptyCartResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *EmptyCartResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *EmptyCartResult) Unmarshal(in []byte) error {\n\tmsg := new(cart.EmptyCartResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *EmptyCartResult) GetSuccess() *cart.EmptyCartResp {\n\tif !p.IsSetSuccess() {\n\t\treturn EmptyCartResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *EmptyCartResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*cart.EmptyCartResp)\n}\n\nfunc (p *EmptyCartResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *EmptyCartResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) AddItem(ctx context.Context, Req *cart.AddItemReq) (r *cart.AddItemResp, err error) {\n\tvar _args AddItemArgs\n\t_args.Req = Req\n\tvar _result AddItemResult\n\tif err = p.c.Call(ctx, \"AddItem\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetCart(ctx context.Context, Req *cart.GetCartReq) (r *cart.GetCartResp, err error) {\n\tvar _args GetCartArgs\n\t_args.Req = Req\n\tvar _result GetCartResult\n\tif err = p.c.Call(ctx, \"GetCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq) (r *cart.EmptyCartResp, err error) {\n\tvar _args EmptyCartArgs\n\t_args.Req = Req\n\tvar _result EmptyCartResult\n\tif err = p.c.Call(ctx, \"EmptyCart\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/cart/cartservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCartServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCartServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCartServiceClient) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.AddItem(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetCart(ctx, Req)\n}\n\nfunc (p *kCartServiceClient) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.EmptyCart(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/cart/cartservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler cart.CartService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/cart/cartservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage cartservice\n\nimport (\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler cart.CartService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/checkout/checkout.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage checkout\n\nimport (\n\tfmt \"fmt\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutReq[number], err)\n}\n\nfunc (x *CheckoutReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Firstname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Lastname, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutReq) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v payment.CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *CheckoutResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CheckoutResp[number], err)\n}\n\nfunc (x *CheckoutResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CheckoutResp) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Firstname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetFirstname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Lastname == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetLastname())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *CheckoutReq) fastWriteField6(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 6, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *CheckoutResp) fastWriteField2(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *CheckoutReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField2() (n int) {\n\tif x.Firstname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetFirstname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField3() (n int) {\n\tif x.Lastname == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetLastname())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *CheckoutReq) sizeField6() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(6, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *CheckoutResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *CheckoutResp) sizeField2() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_CheckoutReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"Firstname\",\n\t3: \"Lastname\",\n\t4: \"Email\",\n\t5: \"Address\",\n\t6: \"CreditCard\",\n}\n\nvar fieldIDToName_CheckoutResp = map[int32]string{\n\t1: \"OrderId\",\n\t2: \"TransactionId\",\n}\n\nvar _ = payment.File_payment_proto\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/checkout/checkout.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: checkout.proto\n\npackage checkout\n\nimport (\n\tcontext \"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       string `protobuf:\"bytes,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() string {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn \"\"\n}\n\ntype CheckoutReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId     uint32                  `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tFirstname  string                  `protobuf:\"bytes,2,opt,name=firstname,proto3\" json:\"firstname,omitempty\"`\n\tLastname   string                  `protobuf:\"bytes,3,opt,name=lastname,proto3\" json:\"lastname,omitempty\"`\n\tEmail      string                  `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tAddress    *Address                `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tCreditCard *payment.CreditCardInfo `protobuf:\"bytes,6,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n}\n\nfunc (x *CheckoutReq) Reset() {\n\t*x = CheckoutReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutReq) ProtoMessage() {}\n\nfunc (x *CheckoutReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutReq.ProtoReflect.Descriptor instead.\nfunc (*CheckoutReq) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CheckoutReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *CheckoutReq) GetFirstname() string {\n\tif x != nil {\n\t\treturn x.Firstname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetLastname() string {\n\tif x != nil {\n\t\treturn x.Lastname\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *CheckoutReq) GetCreditCard() *payment.CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\ntype CheckoutResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId       string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tTransactionId string `protobuf:\"bytes,2,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *CheckoutResp) Reset() {\n\t*x = CheckoutResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_checkout_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckoutResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckoutResp) ProtoMessage() {}\n\nfunc (x *CheckoutResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_checkout_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckoutResp.ProtoReflect.Descriptor instead.\nfunc (*CheckoutResp) Descriptor() ([]byte, []int) {\n\treturn file_checkout_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CheckoutResp) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckoutResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_checkout_proto protoreflect.FileDescriptor\n\nvar file_checkout_proto_rawDesc = []byte{\n\t0x0a, 0x0e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x1a, 0x0d, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64,\n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f,\n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,\n\t0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,\n\t0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79,\n\t0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x0b,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75,\n\t0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73,\n\t0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14,\n\t0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,\n\t0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52,\n\t0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x22, 0x50, 0x0a, 0x0c, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,\n\t0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x4e, 0x0a,\n\t0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x3b, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x15, 0x2e, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x2e, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x41, 0x5a,\n\t0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_checkout_proto_rawDescOnce sync.Once\n\tfile_checkout_proto_rawDescData = file_checkout_proto_rawDesc\n)\n\nfunc file_checkout_proto_rawDescGZIP() []byte {\n\tfile_checkout_proto_rawDescOnce.Do(func() {\n\t\tfile_checkout_proto_rawDescData = protoimpl.X.CompressGZIP(file_checkout_proto_rawDescData)\n\t})\n\treturn file_checkout_proto_rawDescData\n}\n\nvar file_checkout_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_checkout_proto_goTypes = []interface{}{\n\t(*Address)(nil),                // 0: checkout.Address\n\t(*CheckoutReq)(nil),            // 1: checkout.CheckoutReq\n\t(*CheckoutResp)(nil),           // 2: checkout.CheckoutResp\n\t(*payment.CreditCardInfo)(nil), // 3: payment.CreditCardInfo\n}\nvar file_checkout_proto_depIdxs = []int32{\n\t0, // 0: checkout.CheckoutReq.address:type_name -> checkout.Address\n\t3, // 1: checkout.CheckoutReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 2: checkout.CheckoutService.Checkout:input_type -> checkout.CheckoutReq\n\t2, // 3: checkout.CheckoutService.Checkout:output_type -> checkout.CheckoutResp\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_checkout_proto_init() }\nfunc file_checkout_proto_init() {\n\tif File_checkout_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_checkout_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_checkout_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckoutResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_checkout_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_checkout_proto_goTypes,\n\t\tDependencyIndexes: file_checkout_proto_depIdxs,\n\t\tMessageInfos:      file_checkout_proto_msgTypes,\n\t}.Build()\n\tFile_checkout_proto = out.File\n\tfile_checkout_proto_rawDesc = nil\n\tfile_checkout_proto_goTypes = nil\n\tfile_checkout_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype CheckoutService interface {\n\tCheckout(ctx context.Context, req *CheckoutReq) (res *CheckoutResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/checkout/checkoutservice/checkoutservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn checkoutServiceServiceInfo\n}\n\nvar checkoutServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"CheckoutService\"\n\thandlerType := (*checkout.CheckoutService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Checkout\": kitex.NewMethodInfo(checkoutHandler, newCheckoutArgs, newCheckoutResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"checkout\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc checkoutHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(checkout.CheckoutReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(checkout.CheckoutService).Checkout(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *CheckoutArgs:\n\t\tsuccess, err := handler.(checkout.CheckoutService).Checkout(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*CheckoutResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newCheckoutArgs() interface{} {\n\treturn &CheckoutArgs{}\n}\n\nfunc newCheckoutResult() interface{} {\n\treturn &CheckoutResult{}\n}\n\ntype CheckoutArgs struct {\n\tReq *checkout.CheckoutReq\n}\n\nfunc (p *CheckoutArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(checkout.CheckoutReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *CheckoutArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *CheckoutArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *CheckoutArgs) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar CheckoutArgs_Req_DEFAULT *checkout.CheckoutReq\n\nfunc (p *CheckoutArgs) GetReq() *checkout.CheckoutReq {\n\tif !p.IsSetReq() {\n\t\treturn CheckoutArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *CheckoutArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *CheckoutArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype CheckoutResult struct {\n\tSuccess *checkout.CheckoutResp\n}\n\nvar CheckoutResult_Success_DEFAULT *checkout.CheckoutResp\n\nfunc (p *CheckoutResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(checkout.CheckoutResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *CheckoutResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *CheckoutResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *CheckoutResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *CheckoutResult) Unmarshal(in []byte) error {\n\tmsg := new(checkout.CheckoutResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *CheckoutResult) GetSuccess() *checkout.CheckoutResp {\n\tif !p.IsSetSuccess() {\n\t\treturn CheckoutResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *CheckoutResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*checkout.CheckoutResp)\n}\n\nfunc (p *CheckoutResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *CheckoutResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq) (r *checkout.CheckoutResp, err error) {\n\tvar _args CheckoutArgs\n\t_args.Req = Req\n\tvar _result CheckoutResult\n\tif err = p.c.Call(ctx, \"Checkout\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/checkout/checkoutservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kCheckoutServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kCheckoutServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kCheckoutServiceClient) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Checkout(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/checkout/checkoutservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler checkout.CheckoutService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/checkout/checkoutservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage checkoutservice\n\nimport (\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler checkout.CheckoutService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/email/email.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage email\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *EmailReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_EmailReq[number], err)\n}\n\nfunc (x *EmailReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.From, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.To, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ContentType, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Subject, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Content, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *EmailResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\n}\n\nfunc (x *EmailReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.From == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetFrom())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.To == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetTo())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ContentType == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetContentType())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Subject == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetSubject())\n\treturn offset\n}\n\nfunc (x *EmailReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.Content == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 5, x.GetContent())\n\treturn offset\n}\n\nfunc (x *EmailResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\treturn offset\n}\n\nfunc (x *EmailReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField1() (n int) {\n\tif x.From == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetFrom())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField2() (n int) {\n\tif x.To == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetTo())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField3() (n int) {\n\tif x.ContentType == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetContentType())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField4() (n int) {\n\tif x.Subject == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetSubject())\n\treturn n\n}\n\nfunc (x *EmailReq) sizeField5() (n int) {\n\tif x.Content == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(5, x.GetContent())\n\treturn n\n}\n\nfunc (x *EmailResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\treturn n\n}\n\nvar fieldIDToName_EmailReq = map[int32]string{\n\t1: \"From\",\n\t2: \"To\",\n\t3: \"ContentType\",\n\t4: \"Subject\",\n\t5: \"Content\",\n}\n\nvar fieldIDToName_EmailResp = map[int32]string{}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/email/email.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: email.proto\n\npackage email\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype EmailReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFrom        string `protobuf:\"bytes,1,opt,name=from,proto3\" json:\"from,omitempty\"`\n\tTo          string `protobuf:\"bytes,2,opt,name=to,proto3\" json:\"to,omitempty\"`\n\tContentType string `protobuf:\"bytes,3,opt,name=content_type,json=contentType,proto3\" json:\"content_type,omitempty\"`\n\tSubject     string `protobuf:\"bytes,4,opt,name=subject,proto3\" json:\"subject,omitempty\"`\n\tContent     string `protobuf:\"bytes,5,opt,name=content,proto3\" json:\"content,omitempty\"`\n}\n\nfunc (x *EmailReq) Reset() {\n\t*x = EmailReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailReq) ProtoMessage() {}\n\nfunc (x *EmailReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailReq.ProtoReflect.Descriptor instead.\nfunc (*EmailReq) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *EmailReq) GetFrom() string {\n\tif x != nil {\n\t\treturn x.From\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetTo() string {\n\tif x != nil {\n\t\treturn x.To\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContentType() string {\n\tif x != nil {\n\t\treturn x.ContentType\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetSubject() string {\n\tif x != nil {\n\t\treturn x.Subject\n\t}\n\treturn \"\"\n}\n\nfunc (x *EmailReq) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\ntype EmailResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *EmailResp) Reset() {\n\t*x = EmailResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_email_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EmailResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EmailResp) ProtoMessage() {}\n\nfunc (x *EmailResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_email_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EmailResp.ProtoReflect.Descriptor instead.\nfunc (*EmailResp) Descriptor() ([]byte, []int) {\n\treturn file_email_proto_rawDescGZIP(), []int{1}\n}\n\nvar File_email_proto protoreflect.FileDescriptor\n\nvar file_email_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x08, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65,\n\t0x71, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x0b, 0x0a, 0x09,\n\t0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x32, 0x39, 0x0a, 0x0c, 0x45, 0x6d, 0x61,\n\t0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x53, 0x65, 0x6e,\n\t0x64, 0x12, 0x0f, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52,\n\t0x65, 0x71, 0x1a, 0x10, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c,\n\t0x52, 0x65, 0x73, 0x70, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a,\n\t0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63,\n\t0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_email_proto_rawDescOnce sync.Once\n\tfile_email_proto_rawDescData = file_email_proto_rawDesc\n)\n\nfunc file_email_proto_rawDescGZIP() []byte {\n\tfile_email_proto_rawDescOnce.Do(func() {\n\t\tfile_email_proto_rawDescData = protoimpl.X.CompressGZIP(file_email_proto_rawDescData)\n\t})\n\treturn file_email_proto_rawDescData\n}\n\nvar file_email_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_email_proto_goTypes = []interface{}{\n\t(*EmailReq)(nil),  // 0: email.EmailReq\n\t(*EmailResp)(nil), // 1: email.EmailResp\n}\nvar file_email_proto_depIdxs = []int32{\n\t0, // 0: email.EmailService.Send:input_type -> email.EmailReq\n\t1, // 1: email.EmailService.Send:output_type -> email.EmailResp\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_email_proto_init() }\nfunc file_email_proto_init() {\n\tif File_email_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_email_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_email_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EmailResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_email_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_email_proto_goTypes,\n\t\tDependencyIndexes: file_email_proto_depIdxs,\n\t\tMessageInfos:      file_email_proto_msgTypes,\n\t}.Build()\n\tFile_email_proto = out.File\n\tfile_email_proto_rawDesc = nil\n\tfile_email_proto_goTypes = nil\n\tfile_email_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype EmailService interface {\n\tSend(ctx context.Context, req *EmailReq) (res *EmailResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/email/emailservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kEmailServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kEmailServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kEmailServiceClient) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Send(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/email/emailservice/emailservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn emailServiceServiceInfo\n}\n\nvar emailServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"EmailService\"\n\thandlerType := (*email.EmailService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Send\": kitex.NewMethodInfo(sendHandler, newSendArgs, newSendResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"email\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc sendHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(email.EmailReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(email.EmailService).Send(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SendArgs:\n\t\tsuccess, err := handler.(email.EmailService).Send(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SendResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSendArgs() interface{} {\n\treturn &SendArgs{}\n}\n\nfunc newSendResult() interface{} {\n\treturn &SendResult{}\n}\n\ntype SendArgs struct {\n\tReq *email.EmailReq\n}\n\nfunc (p *SendArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(email.EmailReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SendArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SendArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SendArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SendArgs) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SendArgs_Req_DEFAULT *email.EmailReq\n\nfunc (p *SendArgs) GetReq() *email.EmailReq {\n\tif !p.IsSetReq() {\n\t\treturn SendArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SendArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SendArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SendResult struct {\n\tSuccess *email.EmailResp\n}\n\nvar SendResult_Success_DEFAULT *email.EmailResp\n\nfunc (p *SendResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(email.EmailResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SendResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SendResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SendResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SendResult) Unmarshal(in []byte) error {\n\tmsg := new(email.EmailResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SendResult) GetSuccess() *email.EmailResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SendResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SendResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*email.EmailResp)\n}\n\nfunc (p *SendResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SendResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Send(ctx context.Context, Req *email.EmailReq) (r *email.EmailResp, err error) {\n\tvar _args SendArgs\n\t_args.Req = Req\n\tvar _result SendResult\n\tif err = p.c.Call(ctx, \"Send\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/email/emailservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler email.EmailService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/email/emailservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage emailservice\n\nimport (\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler email.EmailService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/order/order.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage order\n\nimport (\n\tfmt \"fmt\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *Address) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Address[number], err)\n}\n\nfunc (x *Address) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.StreetAddress, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.City, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.State, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Country, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Address) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.ZipCode, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderReq[number], err)\n}\n\nfunc (x *PlaceOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *PlaceOrderReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderReq) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderItem[number], err)\n}\n\nfunc (x *OrderItem) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v cart.CartItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Item = &v\n\treturn offset, nil\n}\n\nfunc (x *OrderItem) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Cost, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *OrderResult) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_OrderResult[number], err)\n}\n\nfunc (x *OrderResult) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *PlaceOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_PlaceOrderResp[number], err)\n}\n\nfunc (x *PlaceOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderResult\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Order = &v\n\treturn offset, nil\n}\n\nfunc (x *ListOrderReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderReq[number], err)\n}\n\nfunc (x *ListOrderReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 7:\n\t\toffset, err = x.fastReadField7(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Order[number], err)\n}\n\nfunc (x *Order) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v OrderItem\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.OrderItems = append(x.OrderItems, &v)\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserCurrency, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tvar v Address\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Address = &v\n\treturn offset, nil\n}\n\nfunc (x *Order) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Order) fastReadField7(buf []byte, _type int8) (offset int, err error) {\n\tx.CreatedAt, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListOrderResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListOrderResp[number], err)\n}\n\nfunc (x *ListOrderResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Order\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Orders = append(x.Orders, &v)\n\treturn offset, nil\n}\n\nfunc (x *Address) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField1(buf []byte) (offset int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetStreetAddress())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField2(buf []byte) (offset int) {\n\tif x.City == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetCity())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField3(buf []byte) (offset int) {\n\tif x.State == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetState())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField4(buf []byte) (offset int) {\n\tif x.Country == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetCountry())\n\treturn offset\n}\n\nfunc (x *Address) fastWriteField5(buf []byte) (offset int) {\n\tif x.ZipCode == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 5, x.GetZipCode())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 3, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *PlaceOrderReq) fastWriteField5(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *OrderItem) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField1(buf []byte) (offset int) {\n\tif x.Item == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetItem())\n\treturn offset\n}\n\nfunc (x *OrderItem) fastWriteField2(buf []byte) (offset int) {\n\tif x.Cost == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 2, x.GetCost())\n\treturn offset\n}\n\nfunc (x *OrderResult) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *OrderResult) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *PlaceOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Order == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrder())\n\treturn offset\n}\n\nfunc (x *ListOrderReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\toffset += x.fastWriteField7(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField1(buf []byte) (offset int) {\n\tif x.OrderItems == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrderItems()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField2(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField3(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 3, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetUserCurrency())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField5(buf []byte) (offset int) {\n\tif x.Address == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 5, x.GetAddress())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField6(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 6, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *Order) fastWriteField7(buf []byte) (offset int) {\n\tif x.CreatedAt == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 7, x.GetCreatedAt())\n\treturn offset\n}\n\nfunc (x *ListOrderResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListOrderResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Orders == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetOrders() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetOrders()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *Address) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *Address) sizeField1() (n int) {\n\tif x.StreetAddress == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetStreetAddress())\n\treturn n\n}\n\nfunc (x *Address) sizeField2() (n int) {\n\tif x.City == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetCity())\n\treturn n\n}\n\nfunc (x *Address) sizeField3() (n int) {\n\tif x.State == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetState())\n\treturn n\n}\n\nfunc (x *Address) sizeField4() (n int) {\n\tif x.Country == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetCountry())\n\treturn n\n}\n\nfunc (x *Address) sizeField5() (n int) {\n\tif x.ZipCode == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(5, x.GetZipCode())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField2() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField3() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(3, x.GetAddress())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField4() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetEmail())\n\treturn n\n}\n\nfunc (x *PlaceOrderReq) sizeField5() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(5, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *OrderItem) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField1() (n int) {\n\tif x.Item == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetItem())\n\treturn n\n}\n\nfunc (x *OrderItem) sizeField2() (n int) {\n\tif x.Cost == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(2, x.GetCost())\n\treturn n\n}\n\nfunc (x *OrderResult) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *OrderResult) sizeField1() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *PlaceOrderResp) sizeField1() (n int) {\n\tif x.Order == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetOrder())\n\treturn n\n}\n\nfunc (x *ListOrderReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderReq) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\tn += x.sizeField7()\n\treturn n\n}\n\nfunc (x *Order) sizeField1() (n int) {\n\tif x.OrderItems == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrderItems() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrderItems()[i])\n\t}\n\treturn n\n}\n\nfunc (x *Order) sizeField2() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *Order) sizeField3() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(3, x.GetUserId())\n\treturn n\n}\n\nfunc (x *Order) sizeField4() (n int) {\n\tif x.UserCurrency == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetUserCurrency())\n\treturn n\n}\n\nfunc (x *Order) sizeField5() (n int) {\n\tif x.Address == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(5, x.GetAddress())\n\treturn n\n}\n\nfunc (x *Order) sizeField6() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(6, x.GetEmail())\n\treturn n\n}\n\nfunc (x *Order) sizeField7() (n int) {\n\tif x.CreatedAt == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(7, x.GetCreatedAt())\n\treturn n\n}\n\nfunc (x *ListOrderResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListOrderResp) sizeField1() (n int) {\n\tif x.Orders == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetOrders() {\n\t\tn += fastpb.SizeMessage(1, x.GetOrders()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_Address = map[int32]string{\n\t1: \"StreetAddress\",\n\t2: \"City\",\n\t3: \"State\",\n\t4: \"Country\",\n\t5: \"ZipCode\",\n}\n\nvar fieldIDToName_PlaceOrderReq = map[int32]string{\n\t1: \"UserId\",\n\t2: \"UserCurrency\",\n\t3: \"Address\",\n\t4: \"Email\",\n\t5: \"OrderItems\",\n}\n\nvar fieldIDToName_OrderItem = map[int32]string{\n\t1: \"Item\",\n\t2: \"Cost\",\n}\n\nvar fieldIDToName_OrderResult = map[int32]string{\n\t1: \"OrderId\",\n}\n\nvar fieldIDToName_PlaceOrderResp = map[int32]string{\n\t1: \"Order\",\n}\n\nvar fieldIDToName_ListOrderReq = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_Order = map[int32]string{\n\t1: \"OrderItems\",\n\t2: \"OrderId\",\n\t3: \"UserId\",\n\t4: \"UserCurrency\",\n\t5: \"Address\",\n\t6: \"Email\",\n\t7: \"CreatedAt\",\n}\n\nvar fieldIDToName_ListOrderResp = map[int32]string{\n\t1: \"Orders\",\n}\n\nvar _ = cart.File_cart_proto\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/order/order.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: order.proto\n\npackage order\n\nimport (\n\tcontext \"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Address struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStreetAddress string `protobuf:\"bytes,1,opt,name=street_address,json=streetAddress,proto3\" json:\"street_address,omitempty\"`\n\tCity          string `protobuf:\"bytes,2,opt,name=city,proto3\" json:\"city,omitempty\"`\n\tState         string `protobuf:\"bytes,3,opt,name=state,proto3\" json:\"state,omitempty\"`\n\tCountry       string `protobuf:\"bytes,4,opt,name=country,proto3\" json:\"country,omitempty\"`\n\tZipCode       int32  `protobuf:\"varint,5,opt,name=zip_code,json=zipCode,proto3\" json:\"zip_code,omitempty\"`\n}\n\nfunc (x *Address) Reset() {\n\t*x = Address{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Address) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Address) ProtoMessage() {}\n\nfunc (x *Address) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Address.ProtoReflect.Descriptor instead.\nfunc (*Address) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Address) GetStreetAddress() string {\n\tif x != nil {\n\t\treturn x.StreetAddress\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCity() string {\n\tif x != nil {\n\t\treturn x.City\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetState() string {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetCountry() string {\n\tif x != nil {\n\t\treturn x.Country\n\t}\n\treturn \"\"\n}\n\nfunc (x *Address) GetZipCode() int32 {\n\tif x != nil {\n\t\treturn x.ZipCode\n\t}\n\treturn 0\n}\n\ntype PlaceOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId       uint32       `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,2,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,3,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,4,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tOrderItems   []*OrderItem `protobuf:\"bytes,5,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n}\n\nfunc (x *PlaceOrderReq) Reset() {\n\t*x = PlaceOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderReq) ProtoMessage() {}\n\nfunc (x *PlaceOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderReq.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *PlaceOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *PlaceOrderReq) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *PlaceOrderReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *PlaceOrderReq) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\ntype OrderItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItem *cart.CartItem `protobuf:\"bytes,1,opt,name=item,proto3\" json:\"item,omitempty\"`\n\tCost float32        `protobuf:\"fixed32,2,opt,name=cost,proto3\" json:\"cost,omitempty\"`\n}\n\nfunc (x *OrderItem) Reset() {\n\t*x = OrderItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderItem) ProtoMessage() {}\n\nfunc (x *OrderItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderItem.ProtoReflect.Descriptor instead.\nfunc (*OrderItem) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *OrderItem) GetItem() *cart.CartItem {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\nfunc (x *OrderItem) GetCost() float32 {\n\tif x != nil {\n\t\treturn x.Cost\n\t}\n\treturn 0\n}\n\ntype OrderResult struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderId string `protobuf:\"bytes,1,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n}\n\nfunc (x *OrderResult) Reset() {\n\t*x = OrderResult{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OrderResult) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OrderResult) ProtoMessage() {}\n\nfunc (x *OrderResult) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OrderResult.ProtoReflect.Descriptor instead.\nfunc (*OrderResult) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *OrderResult) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\ntype PlaceOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrder *OrderResult `protobuf:\"bytes,1,opt,name=order,proto3\" json:\"order,omitempty\"`\n}\n\nfunc (x *PlaceOrderResp) Reset() {\n\t*x = PlaceOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PlaceOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PlaceOrderResp) ProtoMessage() {}\n\nfunc (x *PlaceOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PlaceOrderResp.ProtoReflect.Descriptor instead.\nfunc (*PlaceOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PlaceOrderResp) GetOrder() *OrderResult {\n\tif x != nil {\n\t\treturn x.Order\n\t}\n\treturn nil\n}\n\ntype ListOrderReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId uint32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ListOrderReq) Reset() {\n\t*x = ListOrderReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderReq) ProtoMessage() {}\n\nfunc (x *ListOrderReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderReq.ProtoReflect.Descriptor instead.\nfunc (*ListOrderReq) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ListOrderReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype Order struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrderItems   []*OrderItem `protobuf:\"bytes,1,rep,name=order_items,json=orderItems,proto3\" json:\"order_items,omitempty\"`\n\tOrderId      string       `protobuf:\"bytes,2,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId       uint32       `protobuf:\"varint,3,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n\tUserCurrency string       `protobuf:\"bytes,4,opt,name=user_currency,json=userCurrency,proto3\" json:\"user_currency,omitempty\"`\n\tAddress      *Address     `protobuf:\"bytes,5,opt,name=address,proto3\" json:\"address,omitempty\"`\n\tEmail        string       `protobuf:\"bytes,6,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tCreatedAt    int32        `protobuf:\"varint,7,opt,name=created_at,json=createdAt,proto3\" json:\"created_at,omitempty\"`\n}\n\nfunc (x *Order) Reset() {\n\t*x = Order{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Order) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Order) ProtoMessage() {}\n\nfunc (x *Order) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Order.ProtoReflect.Descriptor instead.\nfunc (*Order) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Order) GetOrderItems() []*OrderItem {\n\tif x != nil {\n\t\treturn x.OrderItems\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nfunc (x *Order) GetUserCurrency() string {\n\tif x != nil {\n\t\treturn x.UserCurrency\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetAddress() *Address {\n\tif x != nil {\n\t\treturn x.Address\n\t}\n\treturn nil\n}\n\nfunc (x *Order) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *Order) GetCreatedAt() int32 {\n\tif x != nil {\n\t\treturn x.CreatedAt\n\t}\n\treturn 0\n}\n\ntype ListOrderResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOrders []*Order `protobuf:\"bytes,1,rep,name=orders,proto3\" json:\"orders,omitempty\"`\n}\n\nfunc (x *ListOrderResp) Reset() {\n\t*x = ListOrderResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_order_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListOrderResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListOrderResp) ProtoMessage() {}\n\nfunc (x *ListOrderResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_order_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListOrderResp.ProtoReflect.Descriptor instead.\nfunc (*ListOrderResp) Descriptor() ([]byte, []int) {\n\treturn file_order_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ListOrderResp) GetOrders() []*Order {\n\tif x != nil {\n\t\treturn x.Orders\n\t}\n\treturn nil\n}\n\nvar File_order_proto protoreflect.FileDescriptor\n\nvar file_order_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x1a, 0x0a, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0x8f, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a,\n\t0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,\n\t0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x7a, 0x69, 0x70, 0x5f, 0x63,\n\t0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f,\n\t0x64, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65,\n\t0x72, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a,\n\t0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e,\n\t0x63, 0x79, 0x12, 0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72,\n\t0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05,\n\t0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d,\n\t0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e,\n\t0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x43, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74,\n\t0x65, 0x6d, 0x12, 0x22, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d,\n\t0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x28, 0x0a, 0x0b, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x22, 0x27, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf2, 0x01, 0x0a, 0x05, 0x4f, 0x72,\n\t0x64, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65,\n\t0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72,\n\t0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65,\n\t0x72, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49,\n\t0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12,\n\t0x28, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,\n\t0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61,\n\t0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,\n\t0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x35,\n\t0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12,\n\t0x24, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x0c, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x73, 0x32, 0x85, 0x01, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f,\n\t0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61,\n\t0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x6f, 0x72, 0x64,\n\t0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73,\n\t0x70, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72,\n\t0x12, 0x13, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64,\n\t0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3e, 0x5a,\n\t0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67,\n\t0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69,\n\t0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_order_proto_rawDescOnce sync.Once\n\tfile_order_proto_rawDescData = file_order_proto_rawDesc\n)\n\nfunc file_order_proto_rawDescGZIP() []byte {\n\tfile_order_proto_rawDescOnce.Do(func() {\n\t\tfile_order_proto_rawDescData = protoimpl.X.CompressGZIP(file_order_proto_rawDescData)\n\t})\n\treturn file_order_proto_rawDescData\n}\n\nvar file_order_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_order_proto_goTypes = []interface{}{\n\t(*Address)(nil),        // 0: order.Address\n\t(*PlaceOrderReq)(nil),  // 1: order.PlaceOrderReq\n\t(*OrderItem)(nil),      // 2: order.OrderItem\n\t(*OrderResult)(nil),    // 3: order.OrderResult\n\t(*PlaceOrderResp)(nil), // 4: order.PlaceOrderResp\n\t(*ListOrderReq)(nil),   // 5: order.ListOrderReq\n\t(*Order)(nil),          // 6: order.Order\n\t(*ListOrderResp)(nil),  // 7: order.ListOrderResp\n\t(*cart.CartItem)(nil),  // 8: cart.CartItem\n}\nvar file_order_proto_depIdxs = []int32{\n\t0, // 0: order.PlaceOrderReq.address:type_name -> order.Address\n\t2, // 1: order.PlaceOrderReq.order_items:type_name -> order.OrderItem\n\t8, // 2: order.OrderItem.item:type_name -> cart.CartItem\n\t3, // 3: order.PlaceOrderResp.order:type_name -> order.OrderResult\n\t2, // 4: order.Order.order_items:type_name -> order.OrderItem\n\t0, // 5: order.Order.address:type_name -> order.Address\n\t6, // 6: order.ListOrderResp.orders:type_name -> order.Order\n\t1, // 7: order.OrderService.PlaceOrder:input_type -> order.PlaceOrderReq\n\t5, // 8: order.OrderService.ListOrder:input_type -> order.ListOrderReq\n\t4, // 9: order.OrderService.PlaceOrder:output_type -> order.PlaceOrderResp\n\t7, // 10: order.OrderService.ListOrder:output_type -> order.ListOrderResp\n\t9, // [9:11] is the sub-list for method output_type\n\t7, // [7:9] is the sub-list for method input_type\n\t7, // [7:7] is the sub-list for extension type_name\n\t7, // [7:7] is the sub-list for extension extendee\n\t0, // [0:7] is the sub-list for field type_name\n}\n\nfunc init() { file_order_proto_init() }\nfunc file_order_proto_init() {\n\tif File_order_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_order_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Address); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OrderResult); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PlaceOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Order); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_order_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListOrderResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_order_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_order_proto_goTypes,\n\t\tDependencyIndexes: file_order_proto_depIdxs,\n\t\tMessageInfos:      file_order_proto_msgTypes,\n\t}.Build()\n\tFile_order_proto = out.File\n\tfile_order_proto_rawDesc = nil\n\tfile_order_proto_goTypes = nil\n\tfile_order_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype OrderService interface {\n\tPlaceOrder(ctx context.Context, req *PlaceOrderReq) (res *PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, req *ListOrderReq) (res *ListOrderResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/order/orderservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kOrderServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kOrderServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kOrderServiceClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.PlaceOrder(ctx, Req)\n}\n\nfunc (p *kOrderServiceClient) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListOrder(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/order/orderservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler order.OrderService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/order/orderservice/orderservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage orderservice\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn orderServiceServiceInfo\n}\n\nvar orderServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"OrderService\"\n\thandlerType := (*order.OrderService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"PlaceOrder\": kitex.NewMethodInfo(placeOrderHandler, newPlaceOrderArgs, newPlaceOrderResult, false),\n\t\t\"ListOrder\":  kitex.NewMethodInfo(listOrderHandler, newListOrderArgs, newListOrderResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"order\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc placeOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.PlaceOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).PlaceOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *PlaceOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).PlaceOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*PlaceOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newPlaceOrderArgs() interface{} {\n\treturn &PlaceOrderArgs{}\n}\n\nfunc newPlaceOrderResult() interface{} {\n\treturn &PlaceOrderResult{}\n}\n\ntype PlaceOrderArgs struct {\n\tReq *order.PlaceOrderReq\n}\n\nfunc (p *PlaceOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.PlaceOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *PlaceOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *PlaceOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar PlaceOrderArgs_Req_DEFAULT *order.PlaceOrderReq\n\nfunc (p *PlaceOrderArgs) GetReq() *order.PlaceOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn PlaceOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *PlaceOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PlaceOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype PlaceOrderResult struct {\n\tSuccess *order.PlaceOrderResp\n}\n\nvar PlaceOrderResult_Success_DEFAULT *order.PlaceOrderResp\n\nfunc (p *PlaceOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.PlaceOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *PlaceOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *PlaceOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *PlaceOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *PlaceOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.PlaceOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *PlaceOrderResult) GetSuccess() *order.PlaceOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn PlaceOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *PlaceOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.PlaceOrderResp)\n}\n\nfunc (p *PlaceOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PlaceOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc listOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(order.ListOrderReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(order.OrderService).ListOrder(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListOrderArgs:\n\t\tsuccess, err := handler.(order.OrderService).ListOrder(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListOrderResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListOrderArgs() interface{} {\n\treturn &ListOrderArgs{}\n}\n\nfunc newListOrderResult() interface{} {\n\treturn &ListOrderResult{}\n}\n\ntype ListOrderArgs struct {\n\tReq *order.ListOrderReq\n}\n\nfunc (p *ListOrderArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(order.ListOrderReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListOrderArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListOrderArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListOrderArgs) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListOrderArgs_Req_DEFAULT *order.ListOrderReq\n\nfunc (p *ListOrderArgs) GetReq() *order.ListOrderReq {\n\tif !p.IsSetReq() {\n\t\treturn ListOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListOrderResult struct {\n\tSuccess *order.ListOrderResp\n}\n\nvar ListOrderResult_Success_DEFAULT *order.ListOrderResp\n\nfunc (p *ListOrderResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(order.ListOrderResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListOrderResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListOrderResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListOrderResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListOrderResult) Unmarshal(in []byte) error {\n\tmsg := new(order.ListOrderResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListOrderResult) GetSuccess() *order.ListOrderResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*order.ListOrderResp)\n}\n\nfunc (p *ListOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq) (r *order.PlaceOrderResp, err error) {\n\tvar _args PlaceOrderArgs\n\t_args.Req = Req\n\tvar _result PlaceOrderResult\n\tif err = p.c.Call(ctx, \"PlaceOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) ListOrder(ctx context.Context, Req *order.ListOrderReq) (r *order.ListOrderResp, err error) {\n\tvar _args ListOrderArgs\n\t_args.Req = Req\n\tvar _result ListOrderResult\n\tif err = p.c.Call(ctx, \"ListOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/order/orderservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage orderservice\n\nimport (\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler order.OrderService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/payment/payment.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage payment\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *CreditCardInfo) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_CreditCardInfo[number], err)\n}\n\nfunc (x *CreditCardInfo) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardNumber, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardCvv, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationYear, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.CreditCardExpirationMonth, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeReq[number], err)\n}\n\nfunc (x *ChargeReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Amount, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tvar v CreditCardInfo\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.CreditCard = &v\n\treturn offset, nil\n}\n\nfunc (x *ChargeReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.OrderId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeReq) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ChargeResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ChargeResp[number], err)\n}\n\nfunc (x *ChargeResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.TransactionId, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *CreditCardInfo) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField1(buf []byte) (offset int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetCreditCardNumber())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 2, x.GetCreditCardCvv())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField3(buf []byte) (offset int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 3, x.GetCreditCardExpirationYear())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) fastWriteField4(buf []byte) (offset int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 4, x.GetCreditCardExpirationMonth())\n\treturn offset\n}\n\nfunc (x *ChargeReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Amount == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 1, x.GetAmount())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.CreditCard == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 2, x.GetCreditCard())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.OrderId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetOrderId())\n\treturn offset\n}\n\nfunc (x *ChargeReq) fastWriteField4(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 4, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *ChargeResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ChargeResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.TransactionId == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetTransactionId())\n\treturn offset\n}\n\nfunc (x *CreditCardInfo) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField1() (n int) {\n\tif x.CreditCardNumber == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetCreditCardNumber())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField2() (n int) {\n\tif x.CreditCardCvv == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(2, x.GetCreditCardCvv())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField3() (n int) {\n\tif x.CreditCardExpirationYear == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(3, x.GetCreditCardExpirationYear())\n\treturn n\n}\n\nfunc (x *CreditCardInfo) sizeField4() (n int) {\n\tif x.CreditCardExpirationMonth == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(4, x.GetCreditCardExpirationMonth())\n\treturn n\n}\n\nfunc (x *ChargeReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField1() (n int) {\n\tif x.Amount == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(1, x.GetAmount())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField2() (n int) {\n\tif x.CreditCard == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(2, x.GetCreditCard())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField3() (n int) {\n\tif x.OrderId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetOrderId())\n\treturn n\n}\n\nfunc (x *ChargeReq) sizeField4() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(4, x.GetUserId())\n\treturn n\n}\n\nfunc (x *ChargeResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ChargeResp) sizeField1() (n int) {\n\tif x.TransactionId == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetTransactionId())\n\treturn n\n}\n\nvar fieldIDToName_CreditCardInfo = map[int32]string{\n\t1: \"CreditCardNumber\",\n\t2: \"CreditCardCvv\",\n\t3: \"CreditCardExpirationYear\",\n\t4: \"CreditCardExpirationMonth\",\n}\n\nvar fieldIDToName_ChargeReq = map[int32]string{\n\t1: \"Amount\",\n\t2: \"CreditCard\",\n\t3: \"OrderId\",\n\t4: \"UserId\",\n}\n\nvar fieldIDToName_ChargeResp = map[int32]string{\n\t1: \"TransactionId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/payment/payment.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: payment.proto\n\npackage payment\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CreditCardInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCreditCardNumber          string `protobuf:\"bytes,1,opt,name=credit_card_number,json=creditCardNumber,proto3\" json:\"credit_card_number,omitempty\"`\n\tCreditCardCvv             int32  `protobuf:\"varint,2,opt,name=credit_card_cvv,json=creditCardCvv,proto3\" json:\"credit_card_cvv,omitempty\"`\n\tCreditCardExpirationYear  int32  `protobuf:\"varint,3,opt,name=credit_card_expiration_year,json=creditCardExpirationYear,proto3\" json:\"credit_card_expiration_year,omitempty\"`\n\tCreditCardExpirationMonth int32  `protobuf:\"varint,4,opt,name=credit_card_expiration_month,json=creditCardExpirationMonth,proto3\" json:\"credit_card_expiration_month,omitempty\"`\n}\n\nfunc (x *CreditCardInfo) Reset() {\n\t*x = CreditCardInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CreditCardInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreditCardInfo) ProtoMessage() {}\n\nfunc (x *CreditCardInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreditCardInfo.ProtoReflect.Descriptor instead.\nfunc (*CreditCardInfo) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreditCardInfo) GetCreditCardNumber() string {\n\tif x != nil {\n\t\treturn x.CreditCardNumber\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreditCardInfo) GetCreditCardCvv() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardCvv\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationYear() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationYear\n\t}\n\treturn 0\n}\n\nfunc (x *CreditCardInfo) GetCreditCardExpirationMonth() int32 {\n\tif x != nil {\n\t\treturn x.CreditCardExpirationMonth\n\t}\n\treturn 0\n}\n\ntype ChargeReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAmount     float32         `protobuf:\"fixed32,1,opt,name=amount,proto3\" json:\"amount,omitempty\"`\n\tCreditCard *CreditCardInfo `protobuf:\"bytes,2,opt,name=credit_card,json=creditCard,proto3\" json:\"credit_card,omitempty\"`\n\tOrderId    string          `protobuf:\"bytes,3,opt,name=order_id,json=orderId,proto3\" json:\"order_id,omitempty\"`\n\tUserId     uint32          `protobuf:\"varint,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *ChargeReq) Reset() {\n\t*x = ChargeReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeReq) ProtoMessage() {}\n\nfunc (x *ChargeReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeReq.ProtoReflect.Descriptor instead.\nfunc (*ChargeReq) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ChargeReq) GetAmount() float32 {\n\tif x != nil {\n\t\treturn x.Amount\n\t}\n\treturn 0\n}\n\nfunc (x *ChargeReq) GetCreditCard() *CreditCardInfo {\n\tif x != nil {\n\t\treturn x.CreditCard\n\t}\n\treturn nil\n}\n\nfunc (x *ChargeReq) GetOrderId() string {\n\tif x != nil {\n\t\treturn x.OrderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *ChargeReq) GetUserId() uint32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype ChargeResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTransactionId string `protobuf:\"bytes,1,opt,name=transaction_id,json=transactionId,proto3\" json:\"transaction_id,omitempty\"`\n}\n\nfunc (x *ChargeResp) Reset() {\n\t*x = ChargeResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_payment_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ChargeResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChargeResp) ProtoMessage() {}\n\nfunc (x *ChargeResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_payment_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChargeResp.ProtoReflect.Descriptor instead.\nfunc (*ChargeResp) Descriptor() ([]byte, []int) {\n\treturn file_payment_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ChargeResp) GetTransactionId() string {\n\tif x != nil {\n\t\treturn x.TransactionId\n\t}\n\treturn \"\"\n}\n\nvar File_payment_proto protoreflect.FileDescriptor\n\nvar file_payment_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x12, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65,\n\t0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43,\n\t0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x72, 0x65,\n\t0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x76, 0x76, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72, 0x64, 0x43, 0x76,\n\t0x76, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64,\n\t0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x79, 0x65, 0x61, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x59, 0x65, 0x61, 0x72,\n\t0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f,\n\t0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61,\n\t0x72, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x6e, 0x74,\n\t0x68, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12,\n\t0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52,\n\t0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69,\n\t0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,\n\t0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x43, 0x61, 0x72,\n\t0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,\n\t0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75,\n\t0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61,\n\t0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0x45, 0x0a, 0x0e, 0x50, 0x61,\n\t0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x06,\n\t0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x61, 0x79,\n\t0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65,\n\t0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x61, 0x79, 0x6d,\n\t0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_payment_proto_rawDescOnce sync.Once\n\tfile_payment_proto_rawDescData = file_payment_proto_rawDesc\n)\n\nfunc file_payment_proto_rawDescGZIP() []byte {\n\tfile_payment_proto_rawDescOnce.Do(func() {\n\t\tfile_payment_proto_rawDescData = protoimpl.X.CompressGZIP(file_payment_proto_rawDescData)\n\t})\n\treturn file_payment_proto_rawDescData\n}\n\nvar file_payment_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_payment_proto_goTypes = []interface{}{\n\t(*CreditCardInfo)(nil), // 0: payment.CreditCardInfo\n\t(*ChargeReq)(nil),      // 1: payment.ChargeReq\n\t(*ChargeResp)(nil),     // 2: payment.ChargeResp\n}\nvar file_payment_proto_depIdxs = []int32{\n\t0, // 0: payment.ChargeReq.credit_card:type_name -> payment.CreditCardInfo\n\t1, // 1: payment.PaymentService.Charge:input_type -> payment.ChargeReq\n\t2, // 2: payment.PaymentService.Charge:output_type -> payment.ChargeResp\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_payment_proto_init() }\nfunc file_payment_proto_init() {\n\tif File_payment_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_payment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CreditCardInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_payment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ChargeResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_payment_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_payment_proto_goTypes,\n\t\tDependencyIndexes: file_payment_proto_depIdxs,\n\t\tMessageInfos:      file_payment_proto_msgTypes,\n\t}.Build()\n\tFile_payment_proto = out.File\n\tfile_payment_proto_rawDesc = nil\n\tfile_payment_proto_goTypes = nil\n\tfile_payment_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype PaymentService interface {\n\tCharge(ctx context.Context, req *ChargeReq) (res *ChargeResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/payment/paymentservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kPaymentServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kPaymentServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kPaymentServiceClient) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Charge(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/payment/paymentservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler payment.PaymentService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/payment/paymentservice/paymentservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage paymentservice\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn paymentServiceServiceInfo\n}\n\nvar paymentServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"PaymentService\"\n\thandlerType := (*payment.PaymentService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Charge\": kitex.NewMethodInfo(chargeHandler, newChargeArgs, newChargeResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"payment\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc chargeHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(payment.ChargeReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(payment.PaymentService).Charge(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ChargeArgs:\n\t\tsuccess, err := handler.(payment.PaymentService).Charge(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ChargeResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newChargeArgs() interface{} {\n\treturn &ChargeArgs{}\n}\n\nfunc newChargeResult() interface{} {\n\treturn &ChargeResult{}\n}\n\ntype ChargeArgs struct {\n\tReq *payment.ChargeReq\n}\n\nfunc (p *ChargeArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(payment.ChargeReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ChargeArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ChargeArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ChargeArgs) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ChargeArgs_Req_DEFAULT *payment.ChargeReq\n\nfunc (p *ChargeArgs) GetReq() *payment.ChargeReq {\n\tif !p.IsSetReq() {\n\t\treturn ChargeArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ChargeArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ChargeArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ChargeResult struct {\n\tSuccess *payment.ChargeResp\n}\n\nvar ChargeResult_Success_DEFAULT *payment.ChargeResp\n\nfunc (p *ChargeResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(payment.ChargeResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ChargeResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ChargeResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ChargeResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ChargeResult) Unmarshal(in []byte) error {\n\tmsg := new(payment.ChargeResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ChargeResult) GetSuccess() *payment.ChargeResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ChargeResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ChargeResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*payment.ChargeResp)\n}\n\nfunc (p *ChargeResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ChargeResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Charge(ctx context.Context, Req *payment.ChargeReq) (r *payment.ChargeResp, err error) {\n\tvar _args ChargeArgs\n\t_args.Req = Req\n\tvar _result ChargeResult\n\tif err = p.c.Call(ctx, \"Charge\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/payment/paymentservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage paymentservice\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler payment.PaymentService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/product/product.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage product\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *ListProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsReq[number], err)\n}\n\nfunc (x *ListProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Page, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.PageSize, offset, err = fastpb.ReadInt64(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *ListProductsReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.CategoryName, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 4:\n\t\toffset, err = x.fastReadField4(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 5:\n\t\toffset, err = x.fastReadField5(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 6:\n\t\toffset, err = x.fastReadField6(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_Product[number], err)\n}\n\nfunc (x *Product) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Name, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.Description, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField4(buf []byte, _type int8) (offset int, err error) {\n\tx.Picture, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField5(buf []byte, _type int8) (offset int, err error) {\n\tx.Price, offset, err = fastpb.ReadFloat(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *Product) fastReadField6(buf []byte, _type int8) (offset int, err error) {\n\tvar v string\n\tv, offset, err = fastpb.ReadString(buf, _type)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Categories = append(x.Categories, v)\n\treturn offset, err\n}\n\nfunc (x *ListProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_ListProductsResp[number], err)\n}\n\nfunc (x *ListProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Products = append(x.Products, &v)\n\treturn offset, nil\n}\n\nfunc (x *GetProductReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductReq[number], err)\n}\n\nfunc (x *GetProductReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Id, offset, err = fastpb.ReadUint32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *GetProductResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_GetProductResp[number], err)\n}\n\nfunc (x *GetProductResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Product = &v\n\treturn offset, nil\n}\n\nfunc (x *SearchProductsReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsReq[number], err)\n}\n\nfunc (x *SearchProductsReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Query, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *SearchProductsResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_SearchProductsResp[number], err)\n}\n\nfunc (x *SearchProductsResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tvar v Product\n\toffset, err = fastpb.ReadMessage(buf, _type, &v)\n\tif err != nil {\n\t\treturn offset, err\n\t}\n\tx.Results = append(x.Results, &v)\n\treturn offset, nil\n}\n\nfunc (x *ListProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Page == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetPage())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.PageSize == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt64(buf[offset:], 2, x.GetPageSize())\n\treturn offset\n}\n\nfunc (x *ListProductsReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.CategoryName == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetCategoryName())\n\treturn offset\n}\n\nfunc (x *Product) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\toffset += x.fastWriteField4(buf[offset:])\n\toffset += x.fastWriteField5(buf[offset:])\n\toffset += x.fastWriteField6(buf[offset:])\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField2(buf []byte) (offset int) {\n\tif x.Name == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetName())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField3(buf []byte) (offset int) {\n\tif x.Description == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetDescription())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField4(buf []byte) (offset int) {\n\tif x.Picture == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 4, x.GetPicture())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField5(buf []byte) (offset int) {\n\tif x.Price == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteFloat(buf[offset:], 5, x.GetPrice())\n\treturn offset\n}\n\nfunc (x *Product) fastWriteField6(buf []byte) (offset int) {\n\tif len(x.Categories) == 0 {\n\t\treturn offset\n\t}\n\tfor i := range x.GetCategories() {\n\t\toffset += fastpb.WriteString(buf[offset:], 6, x.GetCategories()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *ListProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Products == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetProducts() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProducts()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *GetProductReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Id == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteUint32(buf[offset:], 1, x.GetId())\n\treturn offset\n}\n\nfunc (x *GetProductResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *GetProductResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Product == nil {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetProduct())\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Query == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetQuery())\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *SearchProductsResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.Results == nil {\n\t\treturn offset\n\t}\n\tfor i := range x.GetResults() {\n\t\toffset += fastpb.WriteMessage(buf[offset:], 1, x.GetResults()[i])\n\t}\n\treturn offset\n}\n\nfunc (x *ListProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField1() (n int) {\n\tif x.Page == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetPage())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField2() (n int) {\n\tif x.PageSize == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt64(2, x.GetPageSize())\n\treturn n\n}\n\nfunc (x *ListProductsReq) sizeField3() (n int) {\n\tif x.CategoryName == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetCategoryName())\n\treturn n\n}\n\nfunc (x *Product) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\tn += x.sizeField4()\n\tn += x.sizeField5()\n\tn += x.sizeField6()\n\treturn n\n}\n\nfunc (x *Product) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *Product) sizeField2() (n int) {\n\tif x.Name == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetName())\n\treturn n\n}\n\nfunc (x *Product) sizeField3() (n int) {\n\tif x.Description == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetDescription())\n\treturn n\n}\n\nfunc (x *Product) sizeField4() (n int) {\n\tif x.Picture == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(4, x.GetPicture())\n\treturn n\n}\n\nfunc (x *Product) sizeField5() (n int) {\n\tif x.Price == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeFloat(5, x.GetPrice())\n\treturn n\n}\n\nfunc (x *Product) sizeField6() (n int) {\n\tif len(x.Categories) == 0 {\n\t\treturn n\n\t}\n\tfor i := range x.GetCategories() {\n\t\tn += fastpb.SizeString(6, x.GetCategories()[i])\n\t}\n\treturn n\n}\n\nfunc (x *ListProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *ListProductsResp) sizeField1() (n int) {\n\tif x.Products == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetProducts() {\n\t\tn += fastpb.SizeMessage(1, x.GetProducts()[i])\n\t}\n\treturn n\n}\n\nfunc (x *GetProductReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductReq) sizeField1() (n int) {\n\tif x.Id == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeUint32(1, x.GetId())\n\treturn n\n}\n\nfunc (x *GetProductResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *GetProductResp) sizeField1() (n int) {\n\tif x.Product == nil {\n\t\treturn n\n\t}\n\tn += fastpb.SizeMessage(1, x.GetProduct())\n\treturn n\n}\n\nfunc (x *SearchProductsReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsReq) sizeField1() (n int) {\n\tif x.Query == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetQuery())\n\treturn n\n}\n\nfunc (x *SearchProductsResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *SearchProductsResp) sizeField1() (n int) {\n\tif x.Results == nil {\n\t\treturn n\n\t}\n\tfor i := range x.GetResults() {\n\t\tn += fastpb.SizeMessage(1, x.GetResults()[i])\n\t}\n\treturn n\n}\n\nvar fieldIDToName_ListProductsReq = map[int32]string{\n\t1: \"Page\",\n\t2: \"PageSize\",\n\t3: \"CategoryName\",\n}\n\nvar fieldIDToName_Product = map[int32]string{\n\t1: \"Id\",\n\t2: \"Name\",\n\t3: \"Description\",\n\t4: \"Picture\",\n\t5: \"Price\",\n\t6: \"Categories\",\n}\n\nvar fieldIDToName_ListProductsResp = map[int32]string{\n\t1: \"Products\",\n}\n\nvar fieldIDToName_GetProductReq = map[int32]string{\n\t1: \"Id\",\n}\n\nvar fieldIDToName_GetProductResp = map[int32]string{\n\t1: \"Product\",\n}\n\nvar fieldIDToName_SearchProductsReq = map[int32]string{\n\t1: \"Query\",\n}\n\nvar fieldIDToName_SearchProductsResp = map[int32]string{\n\t1: \"Results\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/product/product.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: product.proto\n\npackage product\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ListProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPage         int32  `protobuf:\"varint,1,opt,name=page,proto3\" json:\"page,omitempty\"`\n\tPageSize     int64  `protobuf:\"varint,2,opt,name=pageSize,proto3\" json:\"pageSize,omitempty\"`\n\tCategoryName string `protobuf:\"bytes,3,opt,name=categoryName,proto3\" json:\"categoryName,omitempty\"`\n}\n\nfunc (x *ListProductsReq) Reset() {\n\t*x = ListProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsReq) ProtoMessage() {}\n\nfunc (x *ListProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsReq.ProtoReflect.Descriptor instead.\nfunc (*ListProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListProductsReq) GetPage() int32 {\n\tif x != nil {\n\t\treturn x.Page\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetPageSize() int64 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListProductsReq) GetCategoryName() string {\n\tif x != nil {\n\t\treturn x.CategoryName\n\t}\n\treturn \"\"\n}\n\ntype Product struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          uint32   `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string   `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tPicture     string   `protobuf:\"bytes,4,opt,name=picture,proto3\" json:\"picture,omitempty\"`\n\tPrice       float32  `protobuf:\"fixed32,5,opt,name=price,proto3\" json:\"price,omitempty\"`\n\tCategories  []string `protobuf:\"bytes,6,rep,name=categories,proto3\" json:\"categories,omitempty\"`\n}\n\nfunc (x *Product) Reset() {\n\t*x = Product{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Product) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Product) ProtoMessage() {}\n\nfunc (x *Product) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Product.ProtoReflect.Descriptor instead.\nfunc (*Product) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Product) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPicture() string {\n\tif x != nil {\n\t\treturn x.Picture\n\t}\n\treturn \"\"\n}\n\nfunc (x *Product) GetPrice() float32 {\n\tif x != nil {\n\t\treturn x.Price\n\t}\n\treturn 0\n}\n\nfunc (x *Product) GetCategories() []string {\n\tif x != nil {\n\t\treturn x.Categories\n\t}\n\treturn nil\n}\n\ntype ListProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProducts []*Product `protobuf:\"bytes,1,rep,name=products,proto3\" json:\"products,omitempty\"`\n}\n\nfunc (x *ListProductsResp) Reset() {\n\t*x = ListProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListProductsResp) ProtoMessage() {}\n\nfunc (x *ListProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListProductsResp.ProtoReflect.Descriptor instead.\nfunc (*ListProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListProductsResp) GetProducts() []*Product {\n\tif x != nil {\n\t\treturn x.Products\n\t}\n\treturn nil\n}\n\ntype GetProductReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId uint32 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetProductReq) Reset() {\n\t*x = GetProductReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductReq) ProtoMessage() {}\n\nfunc (x *GetProductReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductReq.ProtoReflect.Descriptor instead.\nfunc (*GetProductReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetProductReq) GetId() uint32 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetProductResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProduct *Product `protobuf:\"bytes,1,opt,name=product,proto3\" json:\"product,omitempty\"`\n}\n\nfunc (x *GetProductResp) Reset() {\n\t*x = GetProductResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetProductResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetProductResp) ProtoMessage() {}\n\nfunc (x *GetProductResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetProductResp.ProtoReflect.Descriptor instead.\nfunc (*GetProductResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetProductResp) GetProduct() *Product {\n\tif x != nil {\n\t\treturn x.Product\n\t}\n\treturn nil\n}\n\ntype SearchProductsReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n}\n\nfunc (x *SearchProductsReq) Reset() {\n\t*x = SearchProductsReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsReq) ProtoMessage() {}\n\nfunc (x *SearchProductsReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsReq.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsReq) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *SearchProductsReq) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\ntype SearchProductsResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResults []*Product `protobuf:\"bytes,1,rep,name=results,proto3\" json:\"results,omitempty\"`\n}\n\nfunc (x *SearchProductsResp) Reset() {\n\t*x = SearchProductsResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_product_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SearchProductsResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SearchProductsResp) ProtoMessage() {}\n\nfunc (x *SearchProductsResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_product_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SearchProductsResp.ProtoReflect.Descriptor instead.\nfunc (*SearchProductsResp) Descriptor() ([]byte, []int) {\n\treturn file_product_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *SearchProductsResp) GetResults() []*Product {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\nvar File_product_proto protoreflect.FileDescriptor\n\nvar file_product_proto_rawDesc = []byte{\n\t0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x65, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12,\n\t0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63,\n\t0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22,\n\t0x9f, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70,\n\t0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63,\n\t0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18,\n\t0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65,\n\t0x73, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,\n\t0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,\n\t0x74, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x40, 0x0a,\n\t0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52,\n\t0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x50,\n\t0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x32,\n\t0xec, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x61, 0x74, 0x61, 0x6c,\n\t0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x4c, 0x69, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00,\n\t0x12, 0x3f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x16,\n\t0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64,\n\t0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22,\n\t0x00, 0x12, 0x4b, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75,\n\t0x63, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65,\n\t0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x1a,\n\t0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,\n\t0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x40,\n\t0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x77, 0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f,\n\t0x67, 0x6f, 0x6d, 0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b,\n\t0x69, 0x74, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_product_proto_rawDescOnce sync.Once\n\tfile_product_proto_rawDescData = file_product_proto_rawDesc\n)\n\nfunc file_product_proto_rawDescGZIP() []byte {\n\tfile_product_proto_rawDescOnce.Do(func() {\n\t\tfile_product_proto_rawDescData = protoimpl.X.CompressGZIP(file_product_proto_rawDescData)\n\t})\n\treturn file_product_proto_rawDescData\n}\n\nvar file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_product_proto_goTypes = []interface{}{\n\t(*ListProductsReq)(nil),    // 0: product.ListProductsReq\n\t(*Product)(nil),            // 1: product.Product\n\t(*ListProductsResp)(nil),   // 2: product.ListProductsResp\n\t(*GetProductReq)(nil),      // 3: product.GetProductReq\n\t(*GetProductResp)(nil),     // 4: product.GetProductResp\n\t(*SearchProductsReq)(nil),  // 5: product.SearchProductsReq\n\t(*SearchProductsResp)(nil), // 6: product.SearchProductsResp\n}\nvar file_product_proto_depIdxs = []int32{\n\t1, // 0: product.ListProductsResp.products:type_name -> product.Product\n\t1, // 1: product.GetProductResp.product:type_name -> product.Product\n\t1, // 2: product.SearchProductsResp.results:type_name -> product.Product\n\t0, // 3: product.ProductCatalogService.ListProducts:input_type -> product.ListProductsReq\n\t3, // 4: product.ProductCatalogService.GetProduct:input_type -> product.GetProductReq\n\t5, // 5: product.ProductCatalogService.SearchProducts:input_type -> product.SearchProductsReq\n\t2, // 6: product.ProductCatalogService.ListProducts:output_type -> product.ListProductsResp\n\t4, // 7: product.ProductCatalogService.GetProduct:output_type -> product.GetProductResp\n\t6, // 8: product.ProductCatalogService.SearchProducts:output_type -> product.SearchProductsResp\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_product_proto_init() }\nfunc file_product_proto_init() {\n\tif File_product_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_product_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Product); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetProductResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_product_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SearchProductsResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_product_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_product_proto_goTypes,\n\t\tDependencyIndexes: file_product_proto_depIdxs,\n\t\tMessageInfos:      file_product_proto_msgTypes,\n\t}.Build()\n\tFile_product_proto = out.File\n\tfile_product_proto_rawDesc = nil\n\tfile_product_proto_goTypes = nil\n\tfile_product_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype ProductCatalogService interface {\n\tListProducts(ctx context.Context, req *ListProductsReq) (res *ListProductsResp, err error)\n\tGetProduct(ctx context.Context, req *GetProductReq) (res *GetProductResp, err error)\n\tSearchProducts(ctx context.Context, req *SearchProductsReq) (res *SearchProductsResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/product/productcatalogservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kProductCatalogServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kProductCatalogServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kProductCatalogServiceClient) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.ListProducts(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.GetProduct(ctx, Req)\n}\n\nfunc (p *kProductCatalogServiceClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.SearchProducts(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/product/productcatalogservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler product.ProductCatalogService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/product/productcatalogservice/productcatalogservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage productcatalogservice\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn productCatalogServiceServiceInfo\n}\n\nvar productCatalogServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"ProductCatalogService\"\n\thandlerType := (*product.ProductCatalogService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"ListProducts\":   kitex.NewMethodInfo(listProductsHandler, newListProductsArgs, newListProductsResult, false),\n\t\t\"GetProduct\":     kitex.NewMethodInfo(getProductHandler, newGetProductArgs, newGetProductResult, false),\n\t\t\"SearchProducts\": kitex.NewMethodInfo(searchProductsHandler, newSearchProductsArgs, newSearchProductsResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"product\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc listProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.ListProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).ListProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *ListProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).ListProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*ListProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newListProductsArgs() interface{} {\n\treturn &ListProductsArgs{}\n}\n\nfunc newListProductsResult() interface{} {\n\treturn &ListProductsResult{}\n}\n\ntype ListProductsArgs struct {\n\tReq *product.ListProductsReq\n}\n\nfunc (p *ListProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.ListProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *ListProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *ListProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *ListProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar ListProductsArgs_Req_DEFAULT *product.ListProductsReq\n\nfunc (p *ListProductsArgs) GetReq() *product.ListProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn ListProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *ListProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *ListProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype ListProductsResult struct {\n\tSuccess *product.ListProductsResp\n}\n\nvar ListProductsResult_Success_DEFAULT *product.ListProductsResp\n\nfunc (p *ListProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.ListProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *ListProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *ListProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *ListProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *ListProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.ListProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *ListProductsResult) GetSuccess() *product.ListProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn ListProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *ListProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.ListProductsResp)\n}\n\nfunc (p *ListProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ListProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc getProductHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.GetProductReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).GetProduct(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *GetProductArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).GetProduct(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*GetProductResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newGetProductArgs() interface{} {\n\treturn &GetProductArgs{}\n}\n\nfunc newGetProductResult() interface{} {\n\treturn &GetProductResult{}\n}\n\ntype GetProductArgs struct {\n\tReq *product.GetProductReq\n}\n\nfunc (p *GetProductArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.GetProductReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *GetProductArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *GetProductArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *GetProductArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar GetProductArgs_Req_DEFAULT *product.GetProductReq\n\nfunc (p *GetProductArgs) GetReq() *product.GetProductReq {\n\tif !p.IsSetReq() {\n\t\treturn GetProductArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *GetProductArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *GetProductArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype GetProductResult struct {\n\tSuccess *product.GetProductResp\n}\n\nvar GetProductResult_Success_DEFAULT *product.GetProductResp\n\nfunc (p *GetProductResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.GetProductResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *GetProductResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *GetProductResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *GetProductResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *GetProductResult) Unmarshal(in []byte) error {\n\tmsg := new(product.GetProductResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *GetProductResult) GetSuccess() *product.GetProductResp {\n\tif !p.IsSetSuccess() {\n\t\treturn GetProductResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *GetProductResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.GetProductResp)\n}\n\nfunc (p *GetProductResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *GetProductResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc searchProductsHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(product.SearchProductsReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(product.ProductCatalogService).SearchProducts(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *SearchProductsArgs:\n\t\tsuccess, err := handler.(product.ProductCatalogService).SearchProducts(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*SearchProductsResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newSearchProductsArgs() interface{} {\n\treturn &SearchProductsArgs{}\n}\n\nfunc newSearchProductsResult() interface{} {\n\treturn &SearchProductsResult{}\n}\n\ntype SearchProductsArgs struct {\n\tReq *product.SearchProductsReq\n}\n\nfunc (p *SearchProductsArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(product.SearchProductsReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *SearchProductsArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *SearchProductsArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *SearchProductsArgs) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar SearchProductsArgs_Req_DEFAULT *product.SearchProductsReq\n\nfunc (p *SearchProductsArgs) GetReq() *product.SearchProductsReq {\n\tif !p.IsSetReq() {\n\t\treturn SearchProductsArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *SearchProductsArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *SearchProductsArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype SearchProductsResult struct {\n\tSuccess *product.SearchProductsResp\n}\n\nvar SearchProductsResult_Success_DEFAULT *product.SearchProductsResp\n\nfunc (p *SearchProductsResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(product.SearchProductsResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *SearchProductsResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *SearchProductsResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *SearchProductsResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *SearchProductsResult) Unmarshal(in []byte) error {\n\tmsg := new(product.SearchProductsResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *SearchProductsResult) GetSuccess() *product.SearchProductsResp {\n\tif !p.IsSetSuccess() {\n\t\treturn SearchProductsResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *SearchProductsResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*product.SearchProductsResp)\n}\n\nfunc (p *SearchProductsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SearchProductsResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) ListProducts(ctx context.Context, Req *product.ListProductsReq) (r *product.ListProductsResp, err error) {\n\tvar _args ListProductsArgs\n\t_args.Req = Req\n\tvar _result ListProductsResult\n\tif err = p.c.Call(ctx, \"ListProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) GetProduct(ctx context.Context, Req *product.GetProductReq) (r *product.GetProductResp, err error) {\n\tvar _args GetProductArgs\n\t_args.Req = Req\n\tvar _result GetProductResult\n\tif err = p.c.Call(ctx, \"GetProduct\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) SearchProducts(ctx context.Context, Req *product.SearchProductsReq) (r *product.SearchProductsResp, err error) {\n\tvar _args SearchProductsArgs\n\t_args.Req = Req\n\tvar _result SearchProductsResult\n\tif err = p.c.Call(ctx, \"SearchProducts\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/product/productcatalogservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage productcatalogservice\n\nimport (\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler product.ProductCatalogService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/user/user.pb.fast.go",
    "content": "// Code generated by Fastpb v0.0.2. DO NOT EDIT.\n\npackage user\n\nimport (\n\tfmt \"fmt\"\n\tfastpb \"github.com/cloudwego/fastpb\"\n)\n\nvar (\n\t_ = fmt.Errorf\n\t_ = fastpb.Skip\n)\n\nfunc (x *RegisterReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 3:\n\t\toffset, err = x.fastReadField3(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterReq[number], err)\n}\n\nfunc (x *RegisterReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) fastReadField3(buf []byte, _type int8) (offset int, err error) {\n\tx.ConfirmPassword, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_RegisterResp[number], err)\n}\n\nfunc (x *RegisterResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tcase 2:\n\t\toffset, err = x.fastReadField2(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginReq[number], err)\n}\n\nfunc (x *LoginReq) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.Email, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginReq) fastReadField2(buf []byte, _type int8) (offset int, err error) {\n\tx.Password, offset, err = fastpb.ReadString(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *LoginResp) FastRead(buf []byte, _type int8, number int32) (offset int, err error) {\n\tswitch number {\n\tcase 1:\n\t\toffset, err = x.fastReadField1(buf, _type)\n\t\tif err != nil {\n\t\t\tgoto ReadFieldError\n\t\t}\n\tdefault:\n\t\toffset, err = fastpb.Skip(buf, _type, number)\n\t\tif err != nil {\n\t\t\tgoto SkipFieldError\n\t\t}\n\t}\n\treturn offset, nil\nSkipFieldError:\n\treturn offset, fmt.Errorf(\"%T cannot parse invalid wire-format data, error: %s\", x, err)\nReadFieldError:\n\treturn offset, fmt.Errorf(\"%T read field %d '%s' error: %s\", x, number, fieldIDToName_LoginResp[number], err)\n}\n\nfunc (x *LoginResp) fastReadField1(buf []byte, _type int8) (offset int, err error) {\n\tx.UserId, offset, err = fastpb.ReadInt32(buf, _type)\n\treturn offset, err\n}\n\nfunc (x *RegisterReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\toffset += x.fastWriteField3(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *RegisterReq) fastWriteField3(buf []byte) (offset int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 3, x.GetConfirmPassword())\n\treturn offset\n}\n\nfunc (x *RegisterResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *RegisterResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *LoginReq) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\toffset += x.fastWriteField2(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField1(buf []byte) (offset int) {\n\tif x.Email == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 1, x.GetEmail())\n\treturn offset\n}\n\nfunc (x *LoginReq) fastWriteField2(buf []byte) (offset int) {\n\tif x.Password == \"\" {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteString(buf[offset:], 2, x.GetPassword())\n\treturn offset\n}\n\nfunc (x *LoginResp) FastWrite(buf []byte) (offset int) {\n\tif x == nil {\n\t\treturn offset\n\t}\n\toffset += x.fastWriteField1(buf[offset:])\n\treturn offset\n}\n\nfunc (x *LoginResp) fastWriteField1(buf []byte) (offset int) {\n\tif x.UserId == 0 {\n\t\treturn offset\n\t}\n\toffset += fastpb.WriteInt32(buf[offset:], 1, x.GetUserId())\n\treturn offset\n}\n\nfunc (x *RegisterReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\tn += x.sizeField3()\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *RegisterReq) sizeField3() (n int) {\n\tif x.ConfirmPassword == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(3, x.GetConfirmPassword())\n\treturn n\n}\n\nfunc (x *RegisterResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *RegisterResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nfunc (x *LoginReq) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\tn += x.sizeField2()\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField1() (n int) {\n\tif x.Email == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(1, x.GetEmail())\n\treturn n\n}\n\nfunc (x *LoginReq) sizeField2() (n int) {\n\tif x.Password == \"\" {\n\t\treturn n\n\t}\n\tn += fastpb.SizeString(2, x.GetPassword())\n\treturn n\n}\n\nfunc (x *LoginResp) Size() (n int) {\n\tif x == nil {\n\t\treturn n\n\t}\n\tn += x.sizeField1()\n\treturn n\n}\n\nfunc (x *LoginResp) sizeField1() (n int) {\n\tif x.UserId == 0 {\n\t\treturn n\n\t}\n\tn += fastpb.SizeInt32(1, x.GetUserId())\n\treturn n\n}\n\nvar fieldIDToName_RegisterReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n\t3: \"ConfirmPassword\",\n}\n\nvar fieldIDToName_RegisterResp = map[int32]string{\n\t1: \"UserId\",\n}\n\nvar fieldIDToName_LoginReq = map[int32]string{\n\t1: \"Email\",\n\t2: \"Password\",\n}\n\nvar fieldIDToName_LoginResp = map[int32]string{\n\t1: \"UserId\",\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v4.22.0\n// source: user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype RegisterReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail           string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword        string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tConfirmPassword string `protobuf:\"bytes,3,opt,name=confirm_password,json=confirmPassword,proto3\" json:\"confirm_password,omitempty\"`\n}\n\nfunc (x *RegisterReq) Reset() {\n\t*x = RegisterReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterReq) ProtoMessage() {}\n\nfunc (x *RegisterReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterReq.ProtoReflect.Descriptor instead.\nfunc (*RegisterReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *RegisterReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *RegisterReq) GetConfirmPassword() string {\n\tif x != nil {\n\t\treturn x.ConfirmPassword\n\t}\n\treturn \"\"\n}\n\ntype RegisterResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *RegisterResp) Reset() {\n\t*x = RegisterResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RegisterResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RegisterResp) ProtoMessage() {}\n\nfunc (x *RegisterResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RegisterResp.ProtoReflect.Descriptor instead.\nfunc (*RegisterResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *RegisterResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\ntype LoginReq struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEmail    string `protobuf:\"bytes,1,opt,name=email,proto3\" json:\"email,omitempty\"`\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *LoginReq) Reset() {\n\t*x = LoginReq{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginReq) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginReq) ProtoMessage() {}\n\nfunc (x *LoginReq) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginReq.ProtoReflect.Descriptor instead.\nfunc (*LoginReq) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *LoginReq) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *LoginReq) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\ntype LoginResp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUserId int32 `protobuf:\"varint,1,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *LoginResp) Reset() {\n\t*x = LoginResp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LoginResp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LoginResp) ProtoMessage() {}\n\nfunc (x *LoginResp) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.\nfunc (*LoginResp) Descriptor() ([]byte, []int) {\n\treturn file_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *LoginResp) GetUserId() int32 {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn 0\n}\n\nvar File_user_proto protoreflect.FileDescriptor\n\nvar file_user_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x22, 0x6a, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,\n\t0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,\n\t0x6f, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x70,\n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x27,\n\t0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x17,\n\t0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e,\n\t0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,\n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,\n\t0x73, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x6e, 0x0a, 0x0b, 0x55,\n\t0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65,\n\t0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12,\n\t0x2a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67,\n\t0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x77,\n\t0x65, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x67, 0x6f, 0x6d,\n\t0x61, 0x6c, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x65,\n\t0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_user_proto_rawDescOnce sync.Once\n\tfile_user_proto_rawDescData = file_user_proto_rawDesc\n)\n\nfunc file_user_proto_rawDescGZIP() []byte {\n\tfile_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)\n\t})\n\treturn file_user_proto_rawDescData\n}\n\nvar file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_user_proto_goTypes = []interface{}{\n\t(*RegisterReq)(nil),  // 0: user.RegisterReq\n\t(*RegisterResp)(nil), // 1: user.RegisterResp\n\t(*LoginReq)(nil),     // 2: user.LoginReq\n\t(*LoginResp)(nil),    // 3: user.LoginResp\n}\nvar file_user_proto_depIdxs = []int32{\n\t0, // 0: user.UserService.Register:input_type -> user.RegisterReq\n\t2, // 1: user.UserService.Login:input_type -> user.LoginReq\n\t1, // 2: user.UserService.Register:output_type -> user.RegisterResp\n\t3, // 3: user.UserService.Login:output_type -> user.LoginResp\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_user_proto_init() }\nfunc file_user_proto_init() {\n\tif File_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RegisterResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginReq); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LoginResp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_proto = out.File\n\tfile_user_proto_rawDesc = nil\n\tfile_user_proto_goTypes = nil\n\tfile_user_proto_depIdxs = nil\n}\n\nvar _ context.Context\n\n// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\ntype UserService interface {\n\tRegister(ctx context.Context, req *RegisterReq) (res *RegisterResp, err error)\n\tLogin(ctx context.Context, req *LoginReq) (res *LoginResp, err error)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/user/userservice/client.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kUserServiceClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kUserServiceClient struct {\n\t*kClient\n}\n\nfunc (p *kUserServiceClient) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Register(ctx, Req)\n}\n\nfunc (p *kUserServiceClient) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.Login(ctx, Req)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/user/userservice/invoker.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler user.UserService, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/user/userservice/server.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\npackage userservice\n\nimport (\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler user.UserService, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/kitex_gen/user/userservice/userservice.go",
    "content": "// Code generated by Kitex v0.8.0. DO NOT EDIT.\n\npackage userservice\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n\tstreaming \"github.com/cloudwego/kitex/pkg/streaming\"\n\tproto \"google.golang.org/protobuf/proto\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn userServiceServiceInfo\n}\n\nvar userServiceServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"UserService\"\n\thandlerType := (*user.UserService)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"Register\": kitex.NewMethodInfo(registerHandler, newRegisterArgs, newRegisterResult, false),\n\t\t\"Login\":    kitex.NewMethodInfo(loginHandler, newLoginArgs, newLoginResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\":     \"user\",\n\t\t\"ServiceFilePath\": ``,\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Protobuf,\n\t\tKiteXGenVersion: \"v0.8.0\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc registerHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.RegisterReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Register(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *RegisterArgs:\n\t\tsuccess, err := handler.(user.UserService).Register(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*RegisterResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newRegisterArgs() interface{} {\n\treturn &RegisterArgs{}\n}\n\nfunc newRegisterResult() interface{} {\n\treturn &RegisterResult{}\n}\n\ntype RegisterArgs struct {\n\tReq *user.RegisterReq\n}\n\nfunc (p *RegisterArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.RegisterReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *RegisterArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *RegisterArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *RegisterArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar RegisterArgs_Req_DEFAULT *user.RegisterReq\n\nfunc (p *RegisterArgs) GetReq() *user.RegisterReq {\n\tif !p.IsSetReq() {\n\t\treturn RegisterArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *RegisterArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *RegisterArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype RegisterResult struct {\n\tSuccess *user.RegisterResp\n}\n\nvar RegisterResult_Success_DEFAULT *user.RegisterResp\n\nfunc (p *RegisterResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.RegisterResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *RegisterResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *RegisterResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *RegisterResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *RegisterResult) Unmarshal(in []byte) error {\n\tmsg := new(user.RegisterResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *RegisterResult) GetSuccess() *user.RegisterResp {\n\tif !p.IsSetSuccess() {\n\t\treturn RegisterResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *RegisterResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.RegisterResp)\n}\n\nfunc (p *RegisterResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *RegisterResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc loginHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\tswitch s := arg.(type) {\n\tcase *streaming.Args:\n\t\tst := s.Stream\n\t\treq := new(user.LoginReq)\n\t\tif err := st.RecvMsg(req); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresp, err := handler.(user.UserService).Login(ctx, req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := st.SendMsg(resp); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase *LoginArgs:\n\t\tsuccess, err := handler.(user.UserService).Login(ctx, s.Req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealResult := result.(*LoginResult)\n\t\trealResult.Success = success\n\t}\n\treturn nil\n}\nfunc newLoginArgs() interface{} {\n\treturn &LoginArgs{}\n}\n\nfunc newLoginResult() interface{} {\n\treturn &LoginResult{}\n}\n\ntype LoginArgs struct {\n\tReq *user.LoginReq\n}\n\nfunc (p *LoginArgs) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetReq() {\n\t\tp.Req = new(user.LoginReq)\n\t}\n\treturn p.Req.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginArgs) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.FastWrite(buf)\n}\n\nfunc (p *LoginArgs) Size() (n int) {\n\tif !p.IsSetReq() {\n\t\treturn 0\n\t}\n\treturn p.Req.Size()\n}\n\nfunc (p *LoginArgs) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetReq() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Req)\n}\n\nfunc (p *LoginArgs) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginReq)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Req = msg\n\treturn nil\n}\n\nvar LoginArgs_Req_DEFAULT *user.LoginReq\n\nfunc (p *LoginArgs) GetReq() *user.LoginReq {\n\tif !p.IsSetReq() {\n\t\treturn LoginArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\n\nfunc (p *LoginArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *LoginArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\ntype LoginResult struct {\n\tSuccess *user.LoginResp\n}\n\nvar LoginResult_Success_DEFAULT *user.LoginResp\n\nfunc (p *LoginResult) FastRead(buf []byte, _type int8, number int32) (n int, err error) {\n\tif !p.IsSetSuccess() {\n\t\tp.Success = new(user.LoginResp)\n\t}\n\treturn p.Success.FastRead(buf, _type, number)\n}\n\nfunc (p *LoginResult) FastWrite(buf []byte) (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.FastWrite(buf)\n}\n\nfunc (p *LoginResult) Size() (n int) {\n\tif !p.IsSetSuccess() {\n\t\treturn 0\n\t}\n\treturn p.Success.Size()\n}\n\nfunc (p *LoginResult) Marshal(out []byte) ([]byte, error) {\n\tif !p.IsSetSuccess() {\n\t\treturn out, nil\n\t}\n\treturn proto.Marshal(p.Success)\n}\n\nfunc (p *LoginResult) Unmarshal(in []byte) error {\n\tmsg := new(user.LoginResp)\n\tif err := proto.Unmarshal(in, msg); err != nil {\n\t\treturn err\n\t}\n\tp.Success = msg\n\treturn nil\n}\n\nfunc (p *LoginResult) GetSuccess() *user.LoginResp {\n\tif !p.IsSetSuccess() {\n\t\treturn LoginResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\n\nfunc (p *LoginResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*user.LoginResp)\n}\n\nfunc (p *LoginResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *LoginResult) GetResult() interface{} {\n\treturn p.Success\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) Register(ctx context.Context, Req *user.RegisterReq) (r *user.RegisterResp, err error) {\n\tvar _args RegisterArgs\n\t_args.Req = Req\n\tvar _result RegisterResult\n\tif err = p.c.Call(ctx, \"Register\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) Login(ctx context.Context, Req *user.LoginReq) (r *user.LoginResp, err error) {\n\tvar _args LoginArgs\n\t_args.Req = Req\n\tvar _result LoginResult\n\tif err = p.c.Call(ctx, \"Login\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/cart/cart_client.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart/cartservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() cartservice.Client\n\tService() string\n\tAddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error)\n\tGetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error)\n\tEmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := cartservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient cartservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() cartservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) AddItem(ctx context.Context, Req *cart.AddItemReq, callOptions ...callopt.Option) (r *cart.AddItemResp, err error) {\n\treturn c.kitexClient.AddItem(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetCart(ctx context.Context, Req *cart.GetCartReq, callOptions ...callopt.Option) (r *cart.GetCartResp, err error) {\n\treturn c.kitexClient.GetCart(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) EmptyCart(ctx context.Context, Req *cart.EmptyCartReq, callOptions ...callopt.Option) (r *cart.EmptyCartResp, err error) {\n\treturn c.kitexClient.EmptyCart(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/cart/cart_default.go",
    "content": "package cart\n\nimport (\n\t\"context\"\n\tcart \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/cart\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc AddItem(ctx context.Context, req *cart.AddItemReq, callOptions ...callopt.Option) (resp *cart.AddItemResp, err error) {\n\tresp, err = defaultClient.AddItem(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"AddItem call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetCart(ctx context.Context, req *cart.GetCartReq, callOptions ...callopt.Option) (resp *cart.GetCartResp, err error) {\n\tresp, err = defaultClient.GetCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc EmptyCart(ctx context.Context, req *cart.EmptyCartReq, callOptions ...callopt.Option) (resp *cart.EmptyCartResp, err error) {\n\tresp, err = defaultClient.EmptyCart(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"EmptyCart call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/cart/cart_init.go",
    "content": "package cart\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"cart\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/checkout/checkout_client.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout/checkoutservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() checkoutservice.Client\n\tService() string\n\tCheckout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := checkoutservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient checkoutservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() checkoutservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Checkout(ctx context.Context, Req *checkout.CheckoutReq, callOptions ...callopt.Option) (r *checkout.CheckoutResp, err error) {\n\treturn c.kitexClient.Checkout(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/checkout/checkout_default.go",
    "content": "package checkout\n\nimport (\n\t\"context\"\n\tcheckout \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/checkout\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Checkout(ctx context.Context, req *checkout.CheckoutReq, callOptions ...callopt.Option) (resp *checkout.CheckoutResp, err error) {\n\tresp, err = defaultClient.Checkout(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Checkout call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/checkout/checkout_init.go",
    "content": "package checkout\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"checkout\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/email/email_client.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email/emailservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() emailservice.Client\n\tService() string\n\tSend(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := emailservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient emailservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() emailservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Send(ctx context.Context, Req *email.EmailReq, callOptions ...callopt.Option) (r *email.EmailResp, err error) {\n\treturn c.kitexClient.Send(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/email/email_default.go",
    "content": "package email\n\nimport (\n\t\"context\"\n\temail \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/email\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Send(ctx context.Context, req *email.EmailReq, callOptions ...callopt.Option) (resp *email.EmailResp, err error) {\n\tresp, err = defaultClient.Send(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Send call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/email/email_init.go",
    "content": "package email\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"email\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/order/order_client.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order/orderservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() orderservice.Client\n\tService() string\n\tPlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error)\n\tListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := orderservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient orderservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() orderservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) PlaceOrder(ctx context.Context, Req *order.PlaceOrderReq, callOptions ...callopt.Option) (r *order.PlaceOrderResp, err error) {\n\treturn c.kitexClient.PlaceOrder(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) ListOrder(ctx context.Context, Req *order.ListOrderReq, callOptions ...callopt.Option) (r *order.ListOrderResp, err error) {\n\treturn c.kitexClient.ListOrder(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/order/order_default.go",
    "content": "package order\n\nimport (\n\t\"context\"\n\torder \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/order\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc PlaceOrder(ctx context.Context, req *order.PlaceOrderReq, callOptions ...callopt.Option) (resp *order.PlaceOrderResp, err error) {\n\tresp, err = defaultClient.PlaceOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"PlaceOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc ListOrder(ctx context.Context, req *order.ListOrderReq, callOptions ...callopt.Option) (resp *order.ListOrderResp, err error) {\n\tresp, err = defaultClient.ListOrder(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListOrder call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/order/order_init.go",
    "content": "package order\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"order\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/payment/payment_client.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment/paymentservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() paymentservice.Client\n\tService() string\n\tCharge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := paymentservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient paymentservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() paymentservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Charge(ctx context.Context, Req *payment.ChargeReq, callOptions ...callopt.Option) (r *payment.ChargeResp, err error) {\n\treturn c.kitexClient.Charge(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/payment/payment_default.go",
    "content": "package payment\n\nimport (\n\t\"context\"\n\tpayment \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Charge(ctx context.Context, req *payment.ChargeReq, callOptions ...callopt.Option) (resp *payment.ChargeResp, err error) {\n\tresp, err = defaultClient.Charge(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Charge call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/payment/payment_init.go",
    "content": "package payment\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"payment\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/product/product_client.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product/productcatalogservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() productcatalogservice.Client\n\tService() string\n\tListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error)\n\tGetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error)\n\tSearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := productcatalogservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient productcatalogservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() productcatalogservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) ListProducts(ctx context.Context, Req *product.ListProductsReq, callOptions ...callopt.Option) (r *product.ListProductsResp, err error) {\n\treturn c.kitexClient.ListProducts(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) GetProduct(ctx context.Context, Req *product.GetProductReq, callOptions ...callopt.Option) (r *product.GetProductResp, err error) {\n\treturn c.kitexClient.GetProduct(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) SearchProducts(ctx context.Context, Req *product.SearchProductsReq, callOptions ...callopt.Option) (r *product.SearchProductsResp, err error) {\n\treturn c.kitexClient.SearchProducts(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/product/product_default.go",
    "content": "package product\n\nimport (\n\t\"context\"\n\tproduct \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/product\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc ListProducts(ctx context.Context, req *product.ListProductsReq, callOptions ...callopt.Option) (resp *product.ListProductsResp, err error) {\n\tresp, err = defaultClient.ListProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"ListProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc GetProduct(ctx context.Context, req *product.GetProductReq, callOptions ...callopt.Option) (resp *product.GetProductResp, err error) {\n\tresp, err = defaultClient.GetProduct(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"GetProduct call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc SearchProducts(ctx context.Context, req *product.SearchProductsReq, callOptions ...callopt.Option) (resp *product.SearchProductsResp, err error) {\n\tresp, err = defaultClient.SearchProducts(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"SearchProducts call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/product/product_init.go",
    "content": "package product\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"product\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/user/user_client.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\n\t\"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user/userservice\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n)\n\ntype RPCClient interface {\n\tKitexClient() userservice.Client\n\tService() string\n\tRegister(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error)\n\tLogin(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error)\n}\n\nfunc NewRPCClient(dstService string, opts ...client.Option) (RPCClient, error) {\n\tkitexClient, err := userservice.NewClient(dstService, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcli := &clientImpl{\n\t\tservice:     dstService,\n\t\tkitexClient: kitexClient,\n\t}\n\n\treturn cli, nil\n}\n\ntype clientImpl struct {\n\tservice     string\n\tkitexClient userservice.Client\n}\n\nfunc (c *clientImpl) Service() string {\n\treturn c.service\n}\n\nfunc (c *clientImpl) KitexClient() userservice.Client {\n\treturn c.kitexClient\n}\n\nfunc (c *clientImpl) Register(ctx context.Context, Req *user.RegisterReq, callOptions ...callopt.Option) (r *user.RegisterResp, err error) {\n\treturn c.kitexClient.Register(ctx, Req, callOptions...)\n}\n\nfunc (c *clientImpl) Login(ctx context.Context, Req *user.LoginReq, callOptions ...callopt.Option) (r *user.LoginResp, err error) {\n\treturn c.kitexClient.Login(ctx, Req, callOptions...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/user/user_default.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\tuser \"github.com/cloudwego/biz-demo/gomall/rpc_gen/kitex_gen/user\"\n\t\"github.com/cloudwego/kitex/client/callopt\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n)\n\nfunc Register(ctx context.Context, req *user.RegisterReq, callOptions ...callopt.Option) (resp *user.RegisterResp, err error) {\n\tresp, err = defaultClient.Register(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Register call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc Login(ctx context.Context, req *user.LoginReq, callOptions ...callopt.Option) (resp *user.LoginResp, err error) {\n\tresp, err = defaultClient.Login(ctx, req, callOptions...)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"Login call failed,err =%+v\", err)\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/rpc_gen/rpc/user/user_init.go",
    "content": "package user\n\nimport (\n\t\"sync\"\n\n\t\"github.com/cloudwego/kitex/client\"\n)\n\nvar (\n\t// todo edit custom config\n\tdefaultClient     RPCClient\n\tdefaultDstService = \"user\"\n\tdefaultClientOpts = []client.Option{\n\t\tclient.WithHostPorts(\"127.0.0.1:8888\"),\n\t}\n\tonce sync.Once\n)\n\nfunc init() {\n\tDefaultClient()\n}\n\nfunc DefaultClient() RPCClient {\n\tonce.Do(func() {\n\t\tdefaultClient = newClient(defaultDstService, defaultClientOpts...)\n\t})\n\treturn defaultClient\n}\n\nfunc newClient(dstService string, opts ...client.Option) RPCClient {\n\tc, err := NewRPCClient(dstService, opts...)\n\tif err != nil {\n\t\tpanic(\"failed to init client: \" + err.Error())\n\t}\n\treturn c\n}\n\nfunc InitClient(dstService string, opts ...client.Option) {\n\tdefaultClient = newClient(dstService, opts...)\n}\n"
  },
  {
    "path": "gomall/tutorial/ch17/scripts/copy_env.sh",
    "content": "#!/bin/bash\n\n. scripts/list_app.sh\n\nget_app_list\n\nreadonly root_path=`pwd`\nfor app_path in ${app_list[*]}; do\n  if [[ \"${app_path}\" = \"app/common\" ]]; then\n    continue\n  fi\n  if [[  -e \"${app_path}/.env\" ]]; then\n      continue\n    fi\n  echo \"copy ${app_path} env file\"\n  cp \"${app_path}/.env.example\" \"${app_path}/.env\"\n  echo \"Done! Please replace the real value\"\ndone"
  },
  {
    "path": "gomall/tutorial/ch17/scripts/fix.sh",
    "content": "#!/bin/bash\n\nset -ex\n\nsource scripts/list_app.sh\n\nget_app_list\n\nfor app_path in ${app_list[*]}; do\n    cd ${app_path} && golangci-lint run -E gofumpt --path-prefix=. --fix --timeout=5m && cd ../../\ndone\n"
  },
  {
    "path": "gomall/tutorial/ch17/scripts/gen.sh",
    "content": "#!/bin/bash\n\nsvcName=${1}\n\ncd app/${svcName}\ncwgo client -I ../../idl --type RPC --service ${svcName} --module github.com/cloudwego/biz-demo/gomall/app/${svcName} --idl ../../idl/${svcName}.proto\ncwgo server -I ../../idl --type RPC --service ${svcName} --module github.com/cloudwego/biz-demo/gomall/app/${svcName} --idl ../../idl/${svcName}.proto\n"
  },
  {
    "path": "gomall/tutorial/ch17/scripts/list_app.sh",
    "content": "#!/bin/bash\n\nreadonly dir=\"\"\n\napp_list=()\n\nget_app_list(){\n    local idx=0\n    for d in app/*; do\n        if [ -d \"$d\" ] ; then\n            app_list[idx]=$d\n            idx+=1\n        fi\n    done\n}"
  },
  {
    "path": "gomall/tutorial/ch17/scripts/run.sh",
    "content": "#!/bin/bash\n\nsvcName=${1}\n\nif [ -d \"app/${svcName}\" ];then\n    cd app/${svcName} && air\nfi\n"
  },
  {
    "path": "gomall/tutorial/ch17/scripts/run_all.sh",
    "content": "#!/bin/bash\n\n. scripts/list_app.sh\n\nget_app_list\n\nreadonly root_path=`pwd`\nfor app_path in ${app_list[*]}; do\n    # nohup go run ${root_path}/${app_path}/*.go &\ndone"
  },
  {
    "path": "gomall/tutorial/ch17/scripts/tidy.sh",
    "content": "#!/bin/bash\n\n. scripts/list_app.sh\n\nget_app_list\n\nreadonly root_path=`pwd`\nfor app_path in ${app_list[*]}; do\n    cd \"${root_path}/${app_path}\" &&  go mod tidy -go=1.21\ndone"
  },
  {
    "path": "gomall/tutorial/ch17/scripts/vet.sh",
    "content": "#!/bin/bash\n\n. scripts/list_app.sh\n\nget_app_list\n\nreadonly root_path=`pwd`\nfor app_path in ${app_list[*]}; do\n    go vet ${root_path}/${app_path}\ndone"
  },
  {
    "path": "hack/resolve-modules.sh",
    "content": "#!/usr/bin/env bash\n\n# This is used by the linter action.\n# Recursively finds all directories with a go.mod file and creates\n# a GitHub Actions JSON output option.\n\nset -o errexit\n\nHOME=$(\n\tcd \"$(dirname \"${BASH_SOURCE[0]}\")\" &&\n\t\tcd .. &&\n\t\tpwd\n)\n\nsource \"${HOME}/hack/util.sh\"\nall_modules=$(util::find_modules)\nPATHS=\"\"\nfor mod in $all_modules; do\n\t\tPATHS+=$(printf '{\"workdir\":\"%s\"},' ${mod})\ndone\n\necho \"::set-output name=matrix::{\\\"include\\\":[${PATHS%?}]}\""
  },
  {
    "path": "hack/tools.sh",
    "content": "#!/usr/bin/env bash\n\nset -o errexit\nset -o nounset\nset -o pipefail\n\nHOME=$(\n\tcd \"$(dirname \"${BASH_SOURCE[0]}\")\" &&\n\t\tcd .. &&\n\t\tpwd\n)\n\nsource \"${HOME}/hack/util.sh\"\n\nall_modules=$(util::find_modules)\n\n# test all mod\nfunction test() {\n\tfor mod in $all_modules; do\n\t\t\tpushd \"$mod\" >/dev/null &&\n\t\t\t\techo \"go test $(sed -n 1p go.mod | cut -d ' ' -f2)\" &&\n\t\t\t\tgo test -race -covermode=atomic -coverprofile=coverage.out ./...\n\t\t\tpopd >/dev/null || exit\n\tdone\n}\n\n# vet all mod\nfunction vet() {\n\tfor mod in $all_modules; do\n\t\t\tpushd \"$mod\" >/dev/null &&\n\t\t\t\techo \"go vet $(sed -n 1p go.mod | cut -d ' ' -f2)\" &&\n\t\t\t\tgo vet -stdmethods=false ./...\n\t\t\tpopd >/dev/null || exit\n\tdone\n}\n\nfunction help() {\n\techo \"use: test,vet\"\n}\n\ncase $1 in\nvet)\n\tvet\n\t;;\ntest)\n\ttest\n\t;;\n*)\n\thelp\n\t;;\nesac\n"
  },
  {
    "path": "hack/util.sh",
    "content": "#!/usr/bin/env bash\n\n# find all go mod path\n# returns an array contains mod path\nfunction util::find_modules() {\n\tfind . -not \\( \\\n\t\t\\( \\\n\t\t-path './output' \\\n\t\t-o -path './.git' \\\n\t\t-o -path '*/third_party/*' \\\n\t\t-o -path '*/vendor/*' \\\n\t\t-o -path './gomall/rpc_gen' \\\n\t\t-o -path './gomall/tutorial/*' \\\n\t\t\\) -prune \\\n\t\t\\) -name 'go.mod' -print0 | xargs -0 -I {} dirname {}\n}\n"
  },
  {
    "path": "open-payment-platform/.gitignore",
    "content": "cache/"
  },
  {
    "path": "open-payment-platform/Makefile",
    "content": "MODULE = github.com/cloudwego/biz-demo/open-payment-platform\n\n# start the environment of demo\n.PHONY: start\nstart:\n\tdocker-compose up -d\n\n# stop the environment of demo\n.PHONY: stop\nstop:\n\tdocker-compose down\n\n# generate client code by IDL.\n.PHONY: gen\ngen:\n\tkitex -module $(MODULE) idl/payment.thrift\n\tkitex -module $(MODULE) idl/common.thrift\n\n# run the gateway\n.PHONY: gateway\ngateway:\n\t  go run hertz-gateway/*.go\n"
  },
  {
    "path": "open-payment-platform/README.md",
    "content": "# Open Payment Platform\n\n> Support multi-merchant open payment platform.\n\n## Architecture\n![img.png](./docs/open-payment-platform.png)\n\n## How to Run\n> root directory is `open-payment-platform`.\n#### Prepare\n\n- start docker env with mysql and nacos\n```shell\n# root directory\nmake start\n```\n\n#### Gateway\n\n- start http gateway\n```shell\n# root directory\nmake gateway\n```\n\n#### Payment server\n> run this server,you should wait for the Nacos server is running.\n> How to check the Nacos? you can open the link http://127.0.0.1:8848/nacos/index.html#/login\n> username/password:nacos/nacos\n\n- run backend server\n```shell\n# internal/payment\nmake run \n```\n\n#### Check\n- http gateway\n```shell\ncurl 127.0.0.1\n\n# \"hertz-gateway is running\"% \n```\n\n- payment server\n> you can open the link http://127.0.0.1:8848/nacos/index.html#/serviceManagement\n\n- mysql\n> you can use mysql command or GUI software to check if exist the database `payment`\n\n#### Result\n- Request Gateway\n```shell\ncurl --location --request POST 'http://127.0.0.1/gateway/payment' \\\n--header 'Content-Type: application/x-www-form-urlencoded' \\\n--data-urlencode 'method=qrpay' \\\n--data-urlencode 'merchant_id=OPP9993338844' \\\n--data-urlencode 'sign=DJJDO304GMGMK459GGNGNHNLLD' \\\n--data-urlencode 'sign_type=SM3' \\\n--data-urlencode 'biz_params={\"out_order_no\":\"111222333\",\"total_amount\":\"618\",\"subject\":\"咖啡一杯\",\"merchant_id\":\"OPP9993338844\",\"auth_code\":\"34943985845935459\"}' \\\n--data-urlencode 'nonce_str=439FJDF98HUFHSUGNFDIUSHF'\n```\n\n- Response\n> You should find a new data row in orders table.\n```shell\n{\"err_code\":0,\"err_message\":\"ok\",\"merchant_id\":\"OPP9993338844\",\"nonce_str\":\"439FJDF98HUFHSUGNFDIUSHF\",\"open_id\":\"\",\"order_status\":0,\"out_order_no\":\"111222333\",\"out_transaction_id\":\"\",\"pay_way\":\"111222333\",\"sign\":\"2cadb64844d0b665faf1\",\"sign_type\":\"SM3\",\"sub_merchant_id\":\"\",\"sub_openid\":\"\"}\n```\n- Query Order\n```shell\ncurl --location --request POST 'http://127.0.0.1/gateway/payment' \\\n--header 'Content-Type: application/x-www-form-urlencoded' \\\n--data-urlencode 'method=queryorder' \\\n--data-urlencode 'merchant_id=OPP9993338844' \\\n--data-urlencode 'sign=DJJDO304GMGMK459GGNGNHNLLD' \\\n--data-urlencode 'sign_type=SM3' \\\n--data-urlencode 'biz_params={\"out_order_no\":\"111222333\",\"merchant_id\":\"OPP9993338844\"}' \\\n--data-urlencode 'nonce_str=439FJDF98HUFHSUGNFDIUSHF'\n```\n```shell\n{\"err_code\":0,\"err_message\":\"ok\",\"nonce_str\":\"439FJDF98HUFHSUGNFDIUSHF\",\"order_status\":0,\"sign\":\"19944bf5576669fcfc08\",\"sign_type\":\"SM3\"}\n```\n\n- Close Order\n```shell\ncurl --location --request POST 'http://127.0.0.1/gateway/payment' \\\n--header 'Content-Type: application/x-www-form-urlencoded' \\\n--data-urlencode 'method=closeorder' \\\n--data-urlencode 'merchant_id=OPP9993338844' \\\n--data-urlencode 'sign=DJJDO304GMGMK459GGNGNHNLLD' \\\n--data-urlencode 'sign_type=SM3' \\\n--data-urlencode 'biz_params={\"out_order_no\":\"111222333\",\"merchant_id\":\"OPP9993338844\"}' \\\n--data-urlencode 'nonce_str=439FJDF98HUFHSUGNFDIUSHF'\n```\n```shell\n{\"err_code\":0,\"err_message\":\"ok\",\"nonce_str\":\"439FJDF98HUFHSUGNFDIUSHF\",\"sign\":\"2fa66cf2c59cdcd02f4b\",\"sign_type\":\"SM3\"}\n```\ncheck order status\n```shell\ncurl --location --request POST 'http://127.0.0.1/gateway/payment' \\\n--header 'Content-Type: application/x-www-form-urlencoded' \\\n--data-urlencode 'method=queryorder' \\\n--data-urlencode 'merchant_id=OPP9993338844' \\\n--data-urlencode 'sign=DJJDO304GMGMK459GGNGNHNLLD' \\\n--data-urlencode 'sign_type=SM3' \\\n--data-urlencode 'biz_params={\"out_order_no\":\"111222333\",\"merchant_id\":\"OPP9993338844\"}' \\\n--data-urlencode 'nonce_str=439FJDF98HUFHSUGNFDIUSHF'\n```\n```shell\n{\"err_code\":0,\"err_message\":\"ok\",\"nonce_str\":\"439FJDF98HUFHSUGNFDIUSHF\",\"order_status\":9,\"sign\":\"36f9ac0a04d7c9d8e093\",\"sign_type\":\"SM3\"}\n```\n\n#### Clean up\n```shell\n# root directory\nmake stop\n```\n"
  },
  {
    "path": "open-payment-platform/cmd/payment/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"net\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/payment/paymentsvc\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/cloudwego/kitex/pkg/rpcinfo\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/server\"\n\t\"github.com/kitex-contrib/registry-nacos/registry\"\n)\n\nfunc main() {\n\tr, err := registry.NewDefaultNacosRegistry()\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\n\thdlr := initHandler()\n\n\tsvr := paymentsvc.NewServer(\n\t\thdlr,\n\t\tserver.WithRegistry(r),\n\t\tserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: \"payment\"}),\n\t\tserver.WithServiceAddr(&net.TCPAddr{Port: 8081}),\n\t\tserver.WithMetaHandler(transmeta.ServerTTHeaderHandler),\n\t)\n\n\terr = svr.Run()\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "open-payment-platform/cmd/payment/wire.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n//go:build wireinject\n// +build wireinject\n\npackage main\n\nimport (\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/repository\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/usecase\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/payment\"\n\t\"github.com/google/wire\"\n)\n\n// initHandler initializes payment service handler\n// wire dependency injection\nfunc initHandler() payment.PaymentSvc {\n\tpanic(wire.Build(\n\t\trepository.SQLProviderSet,\n\t\tusecase.ProviderSet,\n\t))\n}\n"
  },
  {
    "path": "open-payment-platform/cmd/payment/wire_gen.go",
    "content": "// Code generated by Wire. DO NOT EDIT.\n\n//go:generate go run github.com/google/wire/cmd/wire\n//go:build !wireinject\n// +build !wireinject\n\npackage main\n\nimport (\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/repository\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/usecase\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/payment\"\n)\n\n// Injectors from wire.go:\n\nfunc initHandler() payment.PaymentSvc {\n\tclient := repository.NewEntClient()\n\tusecaseRepository := repository.NewOrderSQL(client)\n\tpaymentSvc := usecase.NewService(usecaseRepository)\n\treturn paymentSvc\n}\n"
  },
  {
    "path": "open-payment-platform/configs/sql/payment.sql",
    "content": "CREATE DATABASE  IF NOT EXISTS `payment`\n"
  },
  {
    "path": "open-payment-platform/docker-compose.yaml",
    "content": "version: \"3.1\"\nservices:\n  mysql:\n    image: \"mysql\"\n    volumes:\n      - ./configs/sql:/docker-entrypoint-initdb.d\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n    ports:\n      - \"3306:3306\"\n    restart: always\n  nacos:\n    image: \"nacos/nacos-server:2.0.3\"\n    ports:\n      - \"8848:8848\"\n      - \"9848:9848\"\n    environment:\n      MODE: standalone\n"
  },
  {
    "path": "open-payment-platform/go.mod",
    "content": "module github.com/cloudwego/biz-demo/open-payment-platform\n\ngo 1.23.0\n\ntoolchain go1.23.11\n\nreplace github.com/apache/thrift => github.com/apache/thrift v0.13.0\n\nrequire (\n\tentgo.io/ent v0.11.9\n\tgithub.com/apache/thrift v0.16.0\n\tgithub.com/cloudwego/hertz v0.9.5\n\tgithub.com/cloudwego/kitex v0.11.3\n\tgithub.com/go-sql-driver/mysql v1.7.1\n\tgithub.com/google/wire v0.5.0\n\tgithub.com/kitex-contrib/registry-nacos v0.1.1\n\tgithub.com/pkg/errors v0.9.1\n)\n\nrequire (\n\tariga.io/atlas v0.9.1 // indirect\n\tgithub.com/agext/levenshtein v1.2.1 // indirect\n\tgithub.com/aliyun/alibaba-cloud-sdk-go v1.61.18 // indirect\n\tgithub.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect\n\tgithub.com/benbjohnson/clock v1.3.0 // indirect\n\tgithub.com/buger/jsonparser v1.1.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.1 // indirect\n\tgithub.com/bytedance/sonic v1.12.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/configmanager v0.2.2 // indirect\n\tgithub.com/cloudwego/dynamicgo v0.4.0 // indirect\n\tgithub.com/cloudwego/fastpb v0.0.5 // indirect\n\tgithub.com/cloudwego/frugal v0.2.0 // indirect\n\tgithub.com/cloudwego/gopkg v0.1.2 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/cloudwego/localsession v0.0.2 // indirect\n\tgithub.com/cloudwego/netpoll v0.6.4 // indirect\n\tgithub.com/cloudwego/runtimex v0.1.0 // indirect\n\tgithub.com/cloudwego/thriftgo v0.3.17 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-errors/errors v1.0.1 // indirect\n\tgithub.com/go-openapi/inflect v0.19.0 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/go-cmp v0.5.8 // indirect\n\tgithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/hashicorp/hcl/v2 v2.13.0 // indirect\n\tgithub.com/iancoleman/strcase v0.2.0 // indirect\n\tgithub.com/jhump/protoreflect v1.8.2 // indirect\n\tgithub.com/jmespath/go-jmespath v0.4.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/kr/pretty v0.3.0 // indirect\n\tgithub.com/mitchellh/go-wordwrap v1.0.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/nacos-group/nacos-sdk-go v1.1.4 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/rogpeppe/go-internal v1.8.0 // indirect\n\tgithub.com/stretchr/testify v1.9.0 // indirect\n\tgithub.com/tidwall/gjson v1.17.3 // indirect\n\tgithub.com/tidwall/match v1.1.1 // indirect\n\tgithub.com/tidwall/pretty v1.2.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/zclconf/go-cty v1.8.0 // indirect\n\tgo.uber.org/atomic v1.9.0 // indirect\n\tgo.uber.org/multierr v1.8.0 // indirect\n\tgo.uber.org/zap v1.21.0 // indirect\n\tgolang.org/x/arch v0.2.0 // indirect\n\tgolang.org/x/mod v0.25.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sync v0.16.0 // indirect\n\tgolang.org/x/sys v0.34.0 // indirect\n\tgolang.org/x/text v0.27.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect\n\tgoogle.golang.org/grpc v1.48.0 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect\n\tgopkg.in/ini.v1 v1.66.4 // indirect\n\tgopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "open-payment-platform/go.sum",
    "content": "ariga.io/atlas v0.9.1 h1:EpoPMnwsQG0vn9c0sYExpwSYtr7bvuSUXzQclU2pMjc=\nariga.io/atlas v0.9.1/go.mod h1:T230JFcENj4ZZzMkZrXFDSkv+2kXkUgpJ5FQQ5hMcKU=\ncloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\nentgo.io/ent v0.11.9 h1:dbbCkAiPVTRBIJwoZctiSYjB7zxQIBOzVSU5H9VYIQI=\nentgo.io/ent v0.11.9/go.mod h1:KWHOcDZn1xk3mz3ipWdKrQpMvwqa/9B69TUuAPP9W6g=\ngioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=\ngit.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=\ngithub.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=\ngithub.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8=\ngithub.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=\ngithub.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=\ngithub.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=\ngithub.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=\ngithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=\ngithub.com/aliyun/alibaba-cloud-sdk-go v1.61.18 h1:zOVTBdCKFd9JbCKz9/nt+FovbjPFmb7mUnp8nH9fQBA=\ngithub.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=\ngithub.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=\ngithub.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=\ngithub.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=\ngithub.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=\ngithub.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=\ngithub.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.0/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ=\ngithub.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=\ngithub.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=\ngithub.com/bytedance/mockey v1.2.12 h1:aeszOmGw8CPX8CRx1DZ/Glzb1yXvhjDh6jdFBNZjsU4=\ngithub.com/bytedance/mockey v1.2.12/go.mod h1:3ZA4MQasmqC87Tw0w7Ygdy7eHIc2xgpZ8Pona5rsYIk=\ngithub.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=\ngithub.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=\ngithub.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=\ngithub.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=\ngithub.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=\ngithub.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U=\ngithub.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=\ngithub.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=\ngithub.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=\ngithub.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=\ngithub.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU=\ngithub.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI=\ngithub.com/cloudwego/dynamicgo v0.4.0 h1:wQqNRNiSQaLkbcn3sfpEJGZsz3xf8Il4P/3DcENsrFI=\ngithub.com/cloudwego/dynamicgo v0.4.0/go.mod h1:zgWk2oz56EyH790LJSxrTz1j01GJBO964jJQ/y7qjJc=\ngithub.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0=\ngithub.com/cloudwego/fastpb v0.0.5 h1:vYnBPsfbAtU5TVz5+f9UTlmSCixG9F9vRwaqE0mZPZU=\ngithub.com/cloudwego/fastpb v0.0.5/go.mod h1:Bho7aAKBUtT9RPD2cNVkTdx4yQumfSv3If7wYnm1izk=\ngithub.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs=\ngithub.com/cloudwego/frugal v0.2.0 h1:0ETSzQYoYqVvdl7EKjqJ9aJnDoG6TzvNKV3PMQiQTS8=\ngithub.com/cloudwego/frugal v0.2.0/go.mod h1:cpnV6kdRMjN3ylxRo63RNbZ9rBK6oxs70Zk6QZ4Enj4=\ngithub.com/cloudwego/gopkg v0.1.2 h1:650t+RiZGht8qX+y0hl49JXJCuO44GhbGZuxDzr2PyI=\ngithub.com/cloudwego/gopkg v0.1.2/go.mod h1:WoNTdXDPdvL97cBmRUWXVGkh2l2UFmpd9BUvbW2r0Aw=\ngithub.com/cloudwego/hertz v0.9.5 h1:FXV2YFLrNHRdpwT+OoIvv0wEHUC0Bo68CDPujr6VnWo=\ngithub.com/cloudwego/hertz v0.9.5/go.mod h1:UUBt8N8hSTStz7NEvLZ5mnALpBSofNL4DoYzIIp8UaY=\ngithub.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=\ngithub.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=\ngithub.com/cloudwego/kitex v0.5.1/go.mod h1:B3oH+MTQ7/wBL3BrCAMlyeyjAqOpi4pRzCvQcXN7RgM=\ngithub.com/cloudwego/kitex v0.11.3 h1:Qy1GtyuNbygMpwnMw+Aj1iS7fSd0IO7CzxtpZrRJ+Jc=\ngithub.com/cloudwego/kitex v0.11.3/go.mod h1:RHT9ERKFVppJjBfGvwJAPxCIzf4oN1yASW5S4pPZNu4=\ngithub.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY=\ngithub.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8=\ngithub.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=\ngithub.com/cloudwego/netpoll v0.6.4 h1:z/dA4sOTUQof6zZIO4QNnLBXsDFFFEos9OOGloR6kno=\ngithub.com/cloudwego/netpoll v0.6.4/go.mod h1:BtM+GjKTdwKoC8IOzD08/+8eEn2gYoiNLipFca6BVXQ=\ngithub.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI=\ngithub.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8=\ngithub.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E=\ngithub.com/cloudwego/thriftgo v0.3.17 h1:k0iQe2jEAN1WhPsXWvatwHzoxObUSX2Nw5NqdnywS8k=\ngithub.com/cloudwego/thriftgo v0.3.17/go.mod h1:AdLEJJVGW/ZJYvkkYAZf5SaJH+pA3OyC801WSwqcBwI=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=\ngithub.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=\ngithub.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=\ngithub.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=\ngithub.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=\ngithub.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=\ngithub.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=\ngithub.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=\ngithub.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4=\ngithub.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=\ngithub.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=\ngithub.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=\ngithub.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=\ngithub.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=\ngithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=\ngithub.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=\ngithub.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/hcl/v2 v2.13.0 h1:0Apadu1w6M11dyGFxWnmhhcMjkbAiKCv7G1r/2QgCNc=\ngithub.com/hashicorp/hcl/v2 v2.13.0/go.mod h1:e4z5nxYlWNPdDSNYX+ph14EvWYMFm3eP0zIUqPc2jr0=\ngithub.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=\ngithub.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=\ngithub.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=\ngithub.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=\ngithub.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=\ngithub.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=\ngithub.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=\ngithub.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=\ngithub.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kitex-contrib/registry-nacos v0.1.1 h1:foJ78wn8KLiW0LXNlQUhQv2kFKt9nYPsVcZlq6qJ/48=\ngithub.com/kitex-contrib/registry-nacos v0.1.1/go.mod h1:XnDe4b1xMezdke2n53naF7oikLNjwKQZdh3WrM5VHnQ=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=\ngithub.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4=\ngithub.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=\ngithub.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=\ngithub.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=\ngithub.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0=\ngithub.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/nacos-group/nacos-sdk-go v1.1.4 h1:qyrZ7HTWM4aeymFfqnbgNRERh7TWuER10pCB7ddRcTY=\ngithub.com/nacos-group/nacos-sdk-go v1.1.4/go.mod h1:cBv9wy5iObs7khOqov1ERFQrCuTR4ILpgaiaVMxEmGI=\ngithub.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=\ngithub.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=\ngithub.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=\ngithub.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4=\ngithub.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=\ngithub.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=\ngithub.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=\ngithub.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=\ngithub.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=\ngithub.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=\ngithub.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=\ngithub.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=\ngithub.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=\ngithub.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngithub.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA=\ngithub.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=\ngo.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=\ngo.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=\ngo.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=\ngo.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=\ngo.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=\ngo.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=\ngo.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=\ngo.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=\ngolang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=\ngolang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\ngolang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=\ngolang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\ngolang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=\ngolang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=\ngolang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=\ngolang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=\ngonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=\ngonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=\ngonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=\ngonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=\ngonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I=\ngoogle.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=\ngoogle.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4=\ngopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=\nnullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "open-payment-platform/hertz-gateway/.gitignore",
    "content": "*.o\n*.a\n*.so\n_obj\n_test\n*.[568vq]\n[568vq].out\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n_testmain.go\n*.exe\n*.exe~\n*.test\n*.prof\n*.rar\n*.zip\n*.gz\n*.psd\n*.bmd\n*.cfg\n*.pptx\n*.log\n*nohup.out\n*settings.pyc\n*.sublime-project\n*.sublime-workspace\n!.gitkeep\n.DS_Store\n/.idea\n/.vscode\n/output\n*.local.yml\ndumped_hertz_remote_config.json\n\t\t  "
  },
  {
    "path": "open-payment-platform/hertz-gateway/.hz",
    "content": "// Code generated by hz. DO NOT EDIT.\n\nhz version: v0.2.0"
  },
  {
    "path": "open-payment-platform/hertz-gateway/README.md",
    "content": "# Hertz Gateway\n\n## Principle\n\n- Traverse `idl` directory and build `generic client`,when gateway app run.(see [router.go](router.go))\n- All requests of router group `/gateway` must be verified authentication using GatewayAuth.(\n  see [gateway_auth.go](biz/middleware/gateway_auth.go))\n- Accept the requests with the query path of prefix `/gateway`.\n- `Gateway` handler process these requests and route them to backend server by `generic call` client.(\n  see [gateway.go](biz/handler/gateway.go))\n\n## References\n\n- [Generic Call](https://www.cloudwego.io/docs/kitex/tutorials/advanced-feature/generic-call/)\n- [IDL Definition Specification for Mapping between Thrift and HTTP](https://www.cloudwego.io/docs/kitex/tutorials/advanced-feature/generic-call/thrift_idl_annotation_standards/)\n"
  },
  {
    "path": "open-payment-platform/hertz-gateway/biz/errors/errors.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage errors\n\nimport (\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/common\"\n)\n\ntype Err struct {\n\tErrCode int64  `json:\"err_code\"`\n\tErrMsg  string `json:\"err_msg\"`\n}\n\n// New Error, the error_code must be defined in IDL.\nfunc New(errCode common.Err) Err {\n\treturn Err{\n\t\tErrCode: int64(errCode),\n\t\tErrMsg:  errCode.String(),\n\t}\n}\n\nfunc (e Err) Error() string {\n\treturn e.ErrMsg\n}\n"
  },
  {
    "path": "open-payment-platform/hertz-gateway/biz/handler/gateway.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage handler\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/hertz-gateway/biz/errors\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/hertz-gateway/biz/types\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/common\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/kitex/client/genericclient\"\n\t\"github.com/cloudwego/kitex/pkg/generic\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n)\n\ntype requiredParams struct {\n\tMethod     string `form:\"method,required\" json:\"method\"`\n\tMerchantId string `form:\"merchant_id,required\" json:\"merchant_id\"`\n\tBizParams  string `form:\"biz_params,required\" json:\"biz_params\"`\n}\n\nvar SvcMap = make(map[string]genericclient.Client)\n\n// Gateway handle the request with the query path of prefix `/gateway`.\nfunc Gateway(ctx context.Context, c *app.RequestContext) {\n\tsvcName := c.Param(\"svc\")\n\tcli, ok := SvcMap[svcName]\n\tif !ok {\n\t\tc.JSON(http.StatusOK, errors.New(common.Err_BadRequest))\n\t\treturn\n\t}\n\tvar params requiredParams\n\tif err := c.BindAndValidate(&params); err != nil {\n\t\thlog.Error(err)\n\t\tc.JSON(http.StatusOK, errors.New(common.Err_ServerMethodNotFound))\n\t\treturn\n\t}\n\n\treq, err := http.NewRequest(http.MethodPost, \"\", bytes.NewBuffer([]byte(params.BizParams)))\n\tif err != nil {\n\t\thlog.Warnf(\"new http request failed: %v\", err)\n\t\tc.JSON(http.StatusOK, errors.New(common.Err_RequestServerFail))\n\t\treturn\n\t}\n\treq.URL.Path = fmt.Sprintf(\"/%s/%s\", svcName, params.Method)\n\n\tcustomReq, err := generic.FromHTTPRequest(req)\n\tif err != nil {\n\t\thlog.Errorf(\"convert request failed: %v\", err)\n\t\tc.JSON(http.StatusOK, errors.New(common.Err_ServerHandleFail))\n\t\treturn\n\t}\n\tresp, err := cli.GenericCall(ctx, \"\", customReq)\n\trespMap := make(map[string]interface{})\n\tif err != nil {\n\t\thlog.Errorf(\"GenericCall err:%v\", err)\n\t\tbizErr, ok := kerrors.FromBizStatusError(err)\n\t\tif !ok {\n\t\t\tc.JSON(http.StatusOK, errors.New(common.Err_ServerHandleFail))\n\t\t\treturn\n\t\t}\n\t\trespMap[types.ResponseErrCode] = bizErr.BizStatusCode()\n\t\trespMap[types.ResponseErrMessage] = bizErr.BizMessage()\n\t\tc.JSON(http.StatusOK, respMap)\n\t\treturn\n\t}\n\trealResp, ok := resp.(*generic.HTTPResponse)\n\tif !ok {\n\t\tc.JSON(http.StatusOK, errors.New(common.Err_ServerHandleFail))\n\t\treturn\n\t}\n\trealResp.Body[types.ResponseErrCode] = 0\n\trealResp.Body[types.ResponseErrMessage] = \"ok\"\n\tc.JSON(http.StatusOK, realResp.Body)\n}\n"
  },
  {
    "path": "open-payment-platform/hertz-gateway/biz/middleware/gateway_auth.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage middleware\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"net/http\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/hertz-gateway/biz/errors\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/hertz-gateway/biz/types\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/common\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/pkg/auth\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/hertz/pkg/common/utils\"\n)\n\n// AuthParam authentication required parameters\ntype AuthParam struct {\n\tSign       string `form:\"sign,required\" json:\"sign\"`\n\tSignType   string `form:\"sign_type,required\" json:\"sign_type\"`\n\tMerchantId string `form:\"merchant_id,required\" json:\"merchant_id\"`\n\tNonceStr   string `form:\"nonce_str,required\" json:\"nonce_str\"`\n}\n\n// GatewayAuth is the middleware for authentication\nfunc GatewayAuth() []app.HandlerFunc {\n\treturn []app.HandlerFunc{func(ctx context.Context, c *app.RequestContext) {\n\t\tvar authParam AuthParam\n\n\t\t// verify\n\t\tif err := c.BindAndValidate(&authParam); err != nil {\n\t\t\thlog.Error(err)\n\t\t\tc.JSON(http.StatusOK, errors.New(common.Err_BadRequest))\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t\t// TODO get key in the right way\n\t\t// actual business, the key should be different depending on merchant\n\t\tkey := \"123\"\n\t\tp, err := auth.NewSignProvider(authParam.SignType, key)\n\t\tif err != nil {\n\t\t\thlog.Error(err)\n\t\t\tc.JSON(http.StatusOK, errors.New(common.Err_Unauthorized))\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\n\t\tif !p.Verify(authParam.Sign, map[string]interface{}{}) {\n\t\t\thlog.Error(err)\n\t\t\tc.JSON(http.StatusOK, errors.New(common.Err_Unauthorized))\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\n\t\tc.Next(ctx)\n\n\t\t// build signature\n\t\tdata := make(utils.H)\n\t\tif err = json.Unmarshal(c.Response.Body(), &data); err != nil {\n\t\t\tdataJson, _ := json.Marshal(errors.New(common.Err_RequestServerFail))\n\t\t\tc.Response.SetBody(dataJson)\n\t\t\treturn\n\t\t}\n\t\tdata[types.ResponseNonceStr] = authParam.NonceStr\n\t\tdata[types.ResponseSignType] = authParam.SignType\n\t\tdata[types.ResponseSign] = p.Sign(data)\n\t\tdataJson, _ := json.Marshal(data)\n\t\tc.Response.SetBody(dataJson)\n\t}}\n}\n"
  },
  {
    "path": "open-payment-platform/hertz-gateway/biz/router/register.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage router\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// GeneratedRegister registers routers generated by IDL.\nfunc GeneratedRegister(r *server.Hertz) {\n\t// INSERT_POINT: DO NOT DELETE THIS LINE!\n}\n"
  },
  {
    "path": "open-payment-platform/hertz-gateway/biz/types/response.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage types\n\nconst (\n\tResponseErrCode    = \"err_code\"\n\tResponseErrMessage = \"err_message\"\n\tResponseNonceStr   = \"nonce_str\"\n\tResponseSignType   = \"sign_type\"\n\tResponseSign       = \"sign\"\n)\n"
  },
  {
    "path": "open-payment-platform/hertz-gateway/main.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\nfunc main() {\n\th := server.Default(server.WithHostPorts(\":80\"))\n\n\tregister(h)\n\th.Spin()\n}\n"
  },
  {
    "path": "open-payment-platform/hertz-gateway/router.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/hertz-gateway/biz/handler\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/hertz-gateway/biz/middleware\"\n\t\"github.com/cloudwego/hertz/pkg/app\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n\t\"github.com/cloudwego/hertz/pkg/common/hlog\"\n\t\"github.com/cloudwego/kitex/client\"\n\t\"github.com/cloudwego/kitex/client/genericclient\"\n\t\"github.com/cloudwego/kitex/pkg/generic\"\n\t\"github.com/cloudwego/kitex/pkg/transmeta\"\n\t\"github.com/cloudwego/kitex/transport\"\n\t\"github.com/kitex-contrib/registry-nacos/resolver\"\n)\n\n// customizeRegister registers customize routers.\nfunc customizedRegister(r *server.Hertz) {\n\tr.GET(\"/\", func(ctx context.Context, c *app.RequestContext) {\n\t\tc.JSON(http.StatusOK, \"hertz-gateway is running\")\n\t})\n\n\tregisterGateway(r)\n}\n\n// registerGateway registers the router of gateway\nfunc registerGateway(r *server.Hertz) {\n\tgroup := r.Group(\"/gateway\").Use(middleware.GatewayAuth()...)\n\n\tif handler.SvcMap == nil {\n\t\thandler.SvcMap = make(map[string]genericclient.Client)\n\t}\n\tidlPath := \"./idl/\"\n\tc, err := os.ReadDir(idlPath)\n\tif err != nil {\n\t\thlog.Fatalf(\"new thrift file provider failed: %v\", err)\n\t}\n\tnacosResolver, err := resolver.NewDefaultNacosResolver()\n\tif err != nil {\n\t\thlog.Fatalf(\"err:%v\", err)\n\t}\n\n\tfor _, entry := range c {\n\t\tif entry.IsDir() || entry.Name() == \"common.thrift\" {\n\t\t\tcontinue\n\t\t}\n\t\tsvcName := strings.ReplaceAll(entry.Name(), \".thrift\", \"\")\n\n\t\tprovider, err := generic.NewThriftFileProvider(entry.Name(), idlPath)\n\t\tif err != nil {\n\t\t\thlog.Fatalf(\"new thrift file provider failed: %v\", err)\n\t\t\tbreak\n\t\t}\n\t\tg, err := generic.HTTPThriftGeneric(provider)\n\t\tif err != nil {\n\t\t\thlog.Fatal(err)\n\t\t}\n\t\tcli, err := genericclient.NewClient(\n\t\t\tsvcName,\n\t\t\tg,\n\t\t\tclient.WithResolver(nacosResolver),\n\t\t\tclient.WithTransportProtocol(transport.TTHeader),\n\t\t\tclient.WithMetaHandler(transmeta.ClientTTHeaderHandler),\n\t\t)\n\t\tif err != nil {\n\t\t\thlog.Fatal(err)\n\t\t}\n\n\t\thandler.SvcMap[svcName] = cli\n\t\tgroup.POST(\"/:svc\", handler.Gateway)\n\t}\n}\n"
  },
  {
    "path": "open-payment-platform/hertz-gateway/router_gen.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage main\n\nimport (\n\trouter \"github.com/cloudwego/biz-demo/open-payment-platform/hertz-gateway/biz/router\"\n\t\"github.com/cloudwego/hertz/pkg/app/server\"\n)\n\n// register registers all routers.\nfunc register(r *server.Hertz) {\n\trouter.GeneratedRegister(r)\n\n\tcustomizedRegister(r)\n}\n"
  },
  {
    "path": "open-payment-platform/idl/common.thrift",
    "content": "namespace go common\n\nenum Err\n{\n\t// gateway 10001- 19999\n    BadRequest            = 10001,\n\tUnauthorized          = 10002,\n\tServerNotFound        = 10003,\n\tServerMethodNotFound  = 10004,\n\tRequestServerFail     = 10005,\n\tServerHandleFail      = 10006,\n\tResponseUnableParse   = 10007,\n\n\t// payment 20001- 29999\n\tDuplicateOutOrderNo = 20001,\n}\n"
  },
  {
    "path": "open-payment-platform/idl/payment.thrift",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\nnamespace go payment\n\nstruct UnifyPayReq {\n    1: string out_order_no,\n    2: i64 total_amount,\n    3: string subject,\n    4: string merchant_id,\n    5: string pay_way,\n    6: string app_id,\n    7: string sub_open_id,\n    8: string notify_url,\n    9: string client_ip,\n    10: i32 order_expiration\n}\n\nstruct UnifyPayResp {\n    1: string merchant_id,\n    2: string sub_merchant_id,\n    3: string out_order_no,\n    4: string jspay_info,\n    5: string pay_way,\n}\n\nstruct QRPayReq {\n    1: string out_order_no,\n    2: i64 total_amount,\n    3: string subject,\n    4: string merchant_id,\n    5: string auth_code,\n    6: string notify_url,\n    7: string client_ip,\n}\n\nstruct QRPayResp {\n    1: string merchant_id,\n    2: string sub_merchant_id,\n    3: string out_order_no,\n    4: i8 order_status,\n    5: string pay_way,\n    6: string open_id,\n    7: string out_transaction_id,\n    8: string sub_openid,\n}\n\nstruct QueryOrderReq {\n    1: string out_order_no,\n}\n\nstruct QueryOrderResp {\n    1: i8 order_status,\n}\n\nstruct CloseOrderReq {\n     1: string out_order_no,\n}\n\nstruct CloseOrderResp {\n}\n\nservice PaymentSvc {\n    UnifyPayResp UnifyPay(1: UnifyPayReq req)( api.post = '/payment/unifypay', api.param = 'true')\n\n    QRPayResp QRPay(1: QRPayReq req)( api.post = '/payment/qrpay', api.param = 'true')\n\n    QueryOrderResp QueryOrder(1: QueryOrderReq req)( api.post = '/payment/queryorder', api.param = 'true')\n\n    CloseOrderResp CloseOrder(1: CloseOrderReq req)( api.post = '/payment/closeorder', api.param = 'true')\n}\n"
  },
  {
    "path": "open-payment-platform/internal/README.md",
    "content": "# Clean Architecture\n\n## Key Points\n\n- Frameworks are isolated.\n- Independent from Database.\n- All business logic is in a use case.\n- We're always ready to deploy.\n\n## References\n- [The Clean Code Blog by Robert C. Martin (Uncle Bob)](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)\n- [Proposal：工程化模板或标准化的讨论](https://github.com/cloudwego/kitex/issues/500)\n- [Clean Architecture – Caching As A Proxy](https://codecoach.co.nz/clean-architecture-caching-as-a-proxy/)\n- [Clean Architecture, 2 years later](https://eltonminetto.dev/en/post/2020-07-06-clean-architecture-2years-later/)\n"
  },
  {
    "path": "open-payment-platform/internal/payment/Makefile",
    "content": ".PHONY: ent\nent:\n\tgo generate ./infrastructure/ent\n\n.PHONY: wire\nwire:\n\tcd ../../cmd/payment/ && wire\n\n.PHONY: run\nrun:\n\tcd  ../../cmd/payment/ && go run ."
  },
  {
    "path": "open-payment-platform/internal/payment/entity/order.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage entity\n\ntype Order struct {\n\tID              int\n\tMerchantID      string\n\tChannel         string\n\tPayWay          string\n\tOrderStatus     int8\n\tOutOrderNo      string\n\tTotalAmount     uint64\n\tBody            string\n\tAuthCode        string\n\tWxAppid         string\n\tSubOpenid       string\n\tJumpURL         string\n\tNotifyURL       string\n\tClientIP        string\n\tAttach          string\n\tOrderExpiration string\n\tExtendParams    string\n}\n\nfunc NewOrder() *Order {\n\treturn &Order{}\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/client.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/migrate\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/order\"\n\n\t\"entgo.io/ent/dialect\"\n\t\"entgo.io/ent/dialect/sql\"\n)\n\n// Client is the client that holds all ent builders.\ntype Client struct {\n\tconfig\n\t// Schema is the client for creating, migrating and dropping schema.\n\tSchema *migrate.Schema\n\t// Order is the client for interacting with the Order builders.\n\tOrder *OrderClient\n}\n\n// NewClient creates a new client configured with the given options.\nfunc NewClient(opts ...Option) *Client {\n\tcfg := config{log: log.Println, hooks: &hooks{}}\n\tcfg.options(opts...)\n\tclient := &Client{config: cfg}\n\tclient.init()\n\treturn client\n}\n\nfunc (c *Client) init() {\n\tc.Schema = migrate.NewSchema(c.driver)\n\tc.Order = NewOrderClient(c.config)\n}\n\n// Open opens a database/sql.DB specified by the driver name and\n// the data source name, and returns a new client attached to it.\n// Optional parameters can be added for configuring the client.\nfunc Open(driverName, dataSourceName string, options ...Option) (*Client, error) {\n\tswitch driverName {\n\tcase dialect.MySQL, dialect.Postgres, dialect.SQLite:\n\t\tdrv, err := sql.Open(driverName, dataSourceName)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewClient(append(options, Driver(drv))...), nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported driver: %q\", driverName)\n\t}\n}\n\n// Tx returns a new transactional client. The provided context\n// is used until the transaction is committed or rolled back.\nfunc (c *Client) Tx(ctx context.Context) (*Tx, error) {\n\tif _, ok := c.driver.(*txDriver); ok {\n\t\treturn nil, errors.New(\"ent: cannot start a transaction within a transaction\")\n\t}\n\ttx, err := newTx(ctx, c.driver)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"ent: starting a transaction: %w\", err)\n\t}\n\tcfg := c.config\n\tcfg.driver = tx\n\treturn &Tx{\n\t\tctx:    ctx,\n\t\tconfig: cfg,\n\t\tOrder:  NewOrderClient(cfg),\n\t}, nil\n}\n\n// BeginTx returns a transactional client with specified options.\nfunc (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) {\n\tif _, ok := c.driver.(*txDriver); ok {\n\t\treturn nil, errors.New(\"ent: cannot start a transaction within a transaction\")\n\t}\n\ttx, err := c.driver.(interface {\n\t\tBeginTx(context.Context, *sql.TxOptions) (dialect.Tx, error)\n\t}).BeginTx(ctx, opts)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"ent: starting a transaction: %w\", err)\n\t}\n\tcfg := c.config\n\tcfg.driver = &txDriver{tx: tx, drv: c.driver}\n\treturn &Tx{\n\t\tctx:    ctx,\n\t\tconfig: cfg,\n\t\tOrder:  NewOrderClient(cfg),\n\t}, nil\n}\n\n// Debug returns a new debug-client. It's used to get verbose logging on specific operations.\n//\n//\tclient.Debug().\n//\t\tOrder.\n//\t\tQuery().\n//\t\tCount(ctx)\nfunc (c *Client) Debug() *Client {\n\tif c.debug {\n\t\treturn c\n\t}\n\tcfg := c.config\n\tcfg.driver = dialect.Debug(c.driver, c.log)\n\tclient := &Client{config: cfg}\n\tclient.init()\n\treturn client\n}\n\n// Close closes the database connection and prevents new queries from starting.\nfunc (c *Client) Close() error {\n\treturn c.driver.Close()\n}\n\n// Use adds the mutation hooks to all the entity clients.\n// In order to add hooks to a specific client, call: `client.Node.Use(...)`.\nfunc (c *Client) Use(hooks ...Hook) {\n\tc.Order.Use(hooks...)\n}\n\n// OrderClient is a client for the Order schema.\ntype OrderClient struct {\n\tconfig\n}\n\n// NewOrderClient returns a client for the Order from the given config.\nfunc NewOrderClient(c config) *OrderClient {\n\treturn &OrderClient{config: c}\n}\n\n// Use adds a list of mutation hooks to the hooks stack.\n// A call to `Use(f, g, h)` equals to `order.Hooks(f(g(h())))`.\nfunc (c *OrderClient) Use(hooks ...Hook) {\n\tc.hooks.Order = append(c.hooks.Order, hooks...)\n}\n\n// Create returns a builder for creating a Order entity.\nfunc (c *OrderClient) Create() *OrderCreate {\n\tmutation := newOrderMutation(c.config, OpCreate)\n\treturn &OrderCreate{config: c.config, hooks: c.Hooks(), mutation: mutation}\n}\n\n// CreateBulk returns a builder for creating a bulk of Order entities.\nfunc (c *OrderClient) CreateBulk(builders ...*OrderCreate) *OrderCreateBulk {\n\treturn &OrderCreateBulk{config: c.config, builders: builders}\n}\n\n// Update returns an update builder for Order.\nfunc (c *OrderClient) Update() *OrderUpdate {\n\tmutation := newOrderMutation(c.config, OpUpdate)\n\treturn &OrderUpdate{config: c.config, hooks: c.Hooks(), mutation: mutation}\n}\n\n// UpdateOne returns an update builder for the given entity.\nfunc (c *OrderClient) UpdateOne(o *Order) *OrderUpdateOne {\n\tmutation := newOrderMutation(c.config, OpUpdateOne, withOrder(o))\n\treturn &OrderUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation}\n}\n\n// UpdateOneID returns an update builder for the given id.\nfunc (c *OrderClient) UpdateOneID(id int) *OrderUpdateOne {\n\tmutation := newOrderMutation(c.config, OpUpdateOne, withOrderID(id))\n\treturn &OrderUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation}\n}\n\n// Delete returns a delete builder for Order.\nfunc (c *OrderClient) Delete() *OrderDelete {\n\tmutation := newOrderMutation(c.config, OpDelete)\n\treturn &OrderDelete{config: c.config, hooks: c.Hooks(), mutation: mutation}\n}\n\n// DeleteOne returns a builder for deleting the given entity.\nfunc (c *OrderClient) DeleteOne(o *Order) *OrderDeleteOne {\n\treturn c.DeleteOneID(o.ID)\n}\n\n// DeleteOneID returns a builder for deleting the given entity by its id.\nfunc (c *OrderClient) DeleteOneID(id int) *OrderDeleteOne {\n\tbuilder := c.Delete().Where(order.ID(id))\n\tbuilder.mutation.id = &id\n\tbuilder.mutation.op = OpDeleteOne\n\treturn &OrderDeleteOne{builder}\n}\n\n// Query returns a query builder for Order.\nfunc (c *OrderClient) Query() *OrderQuery {\n\treturn &OrderQuery{\n\t\tconfig: c.config,\n\t}\n}\n\n// Get returns a Order entity by its id.\nfunc (c *OrderClient) Get(ctx context.Context, id int) (*Order, error) {\n\treturn c.Query().Where(order.ID(id)).Only(ctx)\n}\n\n// GetX is like Get, but panics if an error occurs.\nfunc (c *OrderClient) GetX(ctx context.Context, id int) *Order {\n\tobj, err := c.Get(ctx, id)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn obj\n}\n\n// Hooks returns the client hooks.\nfunc (c *OrderClient) Hooks() []Hook {\n\treturn c.hooks.Order\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/config.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"entgo.io/ent\"\n\t\"entgo.io/ent/dialect\"\n)\n\n// Option function to configure the client.\ntype Option func(*config)\n\n// Config is the configuration for the client and its builder.\ntype config struct {\n\t// driver used for executing database requests.\n\tdriver dialect.Driver\n\t// debug enable a debug logging.\n\tdebug bool\n\t// log used for logging on debug mode.\n\tlog func(...any)\n\t// hooks to execute on mutations.\n\thooks *hooks\n}\n\n// hooks per client, for fast access.\ntype hooks struct {\n\tOrder []ent.Hook\n}\n\n// Options applies the options on the config object.\nfunc (c *config) options(opts ...Option) {\n\tfor _, opt := range opts {\n\t\topt(c)\n\t}\n\tif c.debug {\n\t\tc.driver = dialect.Debug(c.driver, c.log)\n\t}\n}\n\n// Debug enables debug logging on the ent.Driver.\nfunc Debug() Option {\n\treturn func(c *config) {\n\t\tc.debug = true\n\t}\n}\n\n// Log sets the logging function for debug mode.\nfunc Log(fn func(...any)) Option {\n\treturn func(c *config) {\n\t\tc.log = fn\n\t}\n}\n\n// Driver configures the client driver.\nfunc Driver(driver dialect.Driver) Option {\n\treturn func(c *config) {\n\t\tc.driver = driver\n\t}\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/context.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"context\"\n)\n\ntype clientCtxKey struct{}\n\n// FromContext returns a Client stored inside a context, or nil if there isn't one.\nfunc FromContext(ctx context.Context) *Client {\n\tc, _ := ctx.Value(clientCtxKey{}).(*Client)\n\treturn c\n}\n\n// NewContext returns a new context with the given Client attached.\nfunc NewContext(parent context.Context, c *Client) context.Context {\n\treturn context.WithValue(parent, clientCtxKey{}, c)\n}\n\ntype txCtxKey struct{}\n\n// TxFromContext returns a Tx stored inside a context, or nil if there isn't one.\nfunc TxFromContext(ctx context.Context) *Tx {\n\ttx, _ := ctx.Value(txCtxKey{}).(*Tx)\n\treturn tx\n}\n\n// NewTxContext returns a new context with the given Tx attached.\nfunc NewTxContext(parent context.Context, tx *Tx) context.Context {\n\treturn context.WithValue(parent, txCtxKey{}, tx)\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/ent.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"entgo.io/ent\"\n\t\"entgo.io/ent/dialect/sql\"\n\t\"entgo.io/ent/dialect/sql/sqlgraph\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/order\"\n)\n\n// ent aliases to avoid import conflicts in user's code.\ntype (\n\tOp         = ent.Op\n\tHook       = ent.Hook\n\tValue      = ent.Value\n\tQuery      = ent.Query\n\tPolicy     = ent.Policy\n\tMutator    = ent.Mutator\n\tMutation   = ent.Mutation\n\tMutateFunc = ent.MutateFunc\n)\n\n// OrderFunc applies an ordering on the sql selector.\ntype OrderFunc func(*sql.Selector)\n\n// columnChecker returns a function indicates if the column exists in the given column.\nfunc columnChecker(table string) func(string) error {\n\tchecks := map[string]func(string) bool{\n\t\torder.Table: order.ValidColumn,\n\t}\n\tcheck, ok := checks[table]\n\tif !ok {\n\t\treturn func(string) error {\n\t\t\treturn fmt.Errorf(\"unknown table %q\", table)\n\t\t}\n\t}\n\treturn func(column string) error {\n\t\tif !check(column) {\n\t\t\treturn fmt.Errorf(\"unknown column %q for table %q\", column, table)\n\t\t}\n\t\treturn nil\n\t}\n}\n\n// Asc applies the given fields in ASC order.\nfunc Asc(fields ...string) OrderFunc {\n\treturn func(s *sql.Selector) {\n\t\tcheck := columnChecker(s.TableName())\n\t\tfor _, f := range fields {\n\t\t\tif err := check(f); err != nil {\n\t\t\t\ts.AddError(&ValidationError{Name: f, err: fmt.Errorf(\"ent: %w\", err)})\n\t\t\t}\n\t\t\ts.OrderBy(sql.Asc(s.C(f)))\n\t\t}\n\t}\n}\n\n// Desc applies the given fields in DESC order.\nfunc Desc(fields ...string) OrderFunc {\n\treturn func(s *sql.Selector) {\n\t\tcheck := columnChecker(s.TableName())\n\t\tfor _, f := range fields {\n\t\t\tif err := check(f); err != nil {\n\t\t\t\ts.AddError(&ValidationError{Name: f, err: fmt.Errorf(\"ent: %w\", err)})\n\t\t\t}\n\t\t\ts.OrderBy(sql.Desc(s.C(f)))\n\t\t}\n\t}\n}\n\n// AggregateFunc applies an aggregation step on the group-by traversal/selector.\ntype AggregateFunc func(*sql.Selector) string\n\n// As is a pseudo aggregation function for renaming another other functions with custom names. For example:\n//\n//\tGroupBy(field1, field2).\n//\tAggregate(ent.As(ent.Sum(field1), \"sum_field1\"), (ent.As(ent.Sum(field2), \"sum_field2\")).\n//\tScan(ctx, &v)\nfunc As(fn AggregateFunc, end string) AggregateFunc {\n\treturn func(s *sql.Selector) string {\n\t\treturn sql.As(fn(s), end)\n\t}\n}\n\n// Count applies the \"count\" aggregation function on each group.\nfunc Count() AggregateFunc {\n\treturn func(s *sql.Selector) string {\n\t\treturn sql.Count(\"*\")\n\t}\n}\n\n// Max applies the \"max\" aggregation function on the given field of each group.\nfunc Max(field string) AggregateFunc {\n\treturn func(s *sql.Selector) string {\n\t\tcheck := columnChecker(s.TableName())\n\t\tif err := check(field); err != nil {\n\t\t\ts.AddError(&ValidationError{Name: field, err: fmt.Errorf(\"ent: %w\", err)})\n\t\t\treturn \"\"\n\t\t}\n\t\treturn sql.Max(s.C(field))\n\t}\n}\n\n// Mean applies the \"mean\" aggregation function on the given field of each group.\nfunc Mean(field string) AggregateFunc {\n\treturn func(s *sql.Selector) string {\n\t\tcheck := columnChecker(s.TableName())\n\t\tif err := check(field); err != nil {\n\t\t\ts.AddError(&ValidationError{Name: field, err: fmt.Errorf(\"ent: %w\", err)})\n\t\t\treturn \"\"\n\t\t}\n\t\treturn sql.Avg(s.C(field))\n\t}\n}\n\n// Min applies the \"min\" aggregation function on the given field of each group.\nfunc Min(field string) AggregateFunc {\n\treturn func(s *sql.Selector) string {\n\t\tcheck := columnChecker(s.TableName())\n\t\tif err := check(field); err != nil {\n\t\t\ts.AddError(&ValidationError{Name: field, err: fmt.Errorf(\"ent: %w\", err)})\n\t\t\treturn \"\"\n\t\t}\n\t\treturn sql.Min(s.C(field))\n\t}\n}\n\n// Sum applies the \"sum\" aggregation function on the given field of each group.\nfunc Sum(field string) AggregateFunc {\n\treturn func(s *sql.Selector) string {\n\t\tcheck := columnChecker(s.TableName())\n\t\tif err := check(field); err != nil {\n\t\t\ts.AddError(&ValidationError{Name: field, err: fmt.Errorf(\"ent: %w\", err)})\n\t\t\treturn \"\"\n\t\t}\n\t\treturn sql.Sum(s.C(field))\n\t}\n}\n\n// ValidationError returns when validating a field or edge fails.\ntype ValidationError struct {\n\tName string // Field or edge name.\n\terr  error\n}\n\n// Error implements the error interface.\nfunc (e *ValidationError) Error() string {\n\treturn e.err.Error()\n}\n\n// Unwrap implements the errors.Wrapper interface.\nfunc (e *ValidationError) Unwrap() error {\n\treturn e.err\n}\n\n// IsValidationError returns a boolean indicating whether the error is a validation error.\nfunc IsValidationError(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tvar e *ValidationError\n\treturn errors.As(err, &e)\n}\n\n// NotFoundError returns when trying to fetch a specific entity and it was not found in the database.\ntype NotFoundError struct {\n\tlabel string\n}\n\n// Error implements the error interface.\nfunc (e *NotFoundError) Error() string {\n\treturn \"ent: \" + e.label + \" not found\"\n}\n\n// IsNotFound returns a boolean indicating whether the error is a not found error.\nfunc IsNotFound(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tvar e *NotFoundError\n\treturn errors.As(err, &e)\n}\n\n// MaskNotFound masks not found error.\nfunc MaskNotFound(err error) error {\n\tif IsNotFound(err) {\n\t\treturn nil\n\t}\n\treturn err\n}\n\n// NotSingularError returns when trying to fetch a singular entity and more then one was found in the database.\ntype NotSingularError struct {\n\tlabel string\n}\n\n// Error implements the error interface.\nfunc (e *NotSingularError) Error() string {\n\treturn \"ent: \" + e.label + \" not singular\"\n}\n\n// IsNotSingular returns a boolean indicating whether the error is a not singular error.\nfunc IsNotSingular(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tvar e *NotSingularError\n\treturn errors.As(err, &e)\n}\n\n// NotLoadedError returns when trying to get a node that was not loaded by the query.\ntype NotLoadedError struct {\n\tedge string\n}\n\n// Error implements the error interface.\nfunc (e *NotLoadedError) Error() string {\n\treturn \"ent: \" + e.edge + \" edge was not loaded\"\n}\n\n// IsNotLoaded returns a boolean indicating whether the error is a not loaded error.\nfunc IsNotLoaded(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tvar e *NotLoadedError\n\treturn errors.As(err, &e)\n}\n\n// ConstraintError returns when trying to create/update one or more entities and\n// one or more of their constraints failed. For example, violation of edge or\n// field uniqueness.\ntype ConstraintError struct {\n\tmsg  string\n\twrap error\n}\n\n// Error implements the error interface.\nfunc (e ConstraintError) Error() string {\n\treturn \"ent: constraint failed: \" + e.msg\n}\n\n// Unwrap implements the errors.Wrapper interface.\nfunc (e *ConstraintError) Unwrap() error {\n\treturn e.wrap\n}\n\n// IsConstraintError returns a boolean indicating whether the error is a constraint failure.\nfunc IsConstraintError(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tvar e *ConstraintError\n\treturn errors.As(err, &e)\n}\n\n// selector embedded by the different Select/GroupBy builders.\ntype selector struct {\n\tlabel string\n\tflds  *[]string\n\tfns   []AggregateFunc\n\tscan  func(context.Context, any) error\n}\n\n// ScanX is like Scan, but panics if an error occurs.\nfunc (s *selector) ScanX(ctx context.Context, v any) {\n\tif err := s.scan(ctx, v); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Strings returns list of strings from a selector. It is only allowed when selecting one field.\nfunc (s *selector) Strings(ctx context.Context) ([]string, error) {\n\tif len(*s.flds) > 1 {\n\t\treturn nil, errors.New(\"ent: Strings is not achievable when selecting more than 1 field\")\n\t}\n\tvar v []string\n\tif err := s.scan(ctx, &v); err != nil {\n\t\treturn nil, err\n\t}\n\treturn v, nil\n}\n\n// StringsX is like Strings, but panics if an error occurs.\nfunc (s *selector) StringsX(ctx context.Context) []string {\n\tv, err := s.Strings(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// String returns a single string from a selector. It is only allowed when selecting one field.\nfunc (s *selector) String(ctx context.Context) (_ string, err error) {\n\tvar v []string\n\tif v, err = s.Strings(ctx); err != nil {\n\t\treturn\n\t}\n\tswitch len(v) {\n\tcase 1:\n\t\treturn v[0], nil\n\tcase 0:\n\t\terr = &NotFoundError{s.label}\n\tdefault:\n\t\terr = fmt.Errorf(\"ent: Strings returned %d results when one was expected\", len(v))\n\t}\n\treturn\n}\n\n// StringX is like String, but panics if an error occurs.\nfunc (s *selector) StringX(ctx context.Context) string {\n\tv, err := s.String(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// Ints returns list of ints from a selector. It is only allowed when selecting one field.\nfunc (s *selector) Ints(ctx context.Context) ([]int, error) {\n\tif len(*s.flds) > 1 {\n\t\treturn nil, errors.New(\"ent: Ints is not achievable when selecting more than 1 field\")\n\t}\n\tvar v []int\n\tif err := s.scan(ctx, &v); err != nil {\n\t\treturn nil, err\n\t}\n\treturn v, nil\n}\n\n// IntsX is like Ints, but panics if an error occurs.\nfunc (s *selector) IntsX(ctx context.Context) []int {\n\tv, err := s.Ints(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// Int returns a single int from a selector. It is only allowed when selecting one field.\nfunc (s *selector) Int(ctx context.Context) (_ int, err error) {\n\tvar v []int\n\tif v, err = s.Ints(ctx); err != nil {\n\t\treturn\n\t}\n\tswitch len(v) {\n\tcase 1:\n\t\treturn v[0], nil\n\tcase 0:\n\t\terr = &NotFoundError{s.label}\n\tdefault:\n\t\terr = fmt.Errorf(\"ent: Ints returned %d results when one was expected\", len(v))\n\t}\n\treturn\n}\n\n// IntX is like Int, but panics if an error occurs.\nfunc (s *selector) IntX(ctx context.Context) int {\n\tv, err := s.Int(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// Float64s returns list of float64s from a selector. It is only allowed when selecting one field.\nfunc (s *selector) Float64s(ctx context.Context) ([]float64, error) {\n\tif len(*s.flds) > 1 {\n\t\treturn nil, errors.New(\"ent: Float64s is not achievable when selecting more than 1 field\")\n\t}\n\tvar v []float64\n\tif err := s.scan(ctx, &v); err != nil {\n\t\treturn nil, err\n\t}\n\treturn v, nil\n}\n\n// Float64sX is like Float64s, but panics if an error occurs.\nfunc (s *selector) Float64sX(ctx context.Context) []float64 {\n\tv, err := s.Float64s(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// Float64 returns a single float64 from a selector. It is only allowed when selecting one field.\nfunc (s *selector) Float64(ctx context.Context) (_ float64, err error) {\n\tvar v []float64\n\tif v, err = s.Float64s(ctx); err != nil {\n\t\treturn\n\t}\n\tswitch len(v) {\n\tcase 1:\n\t\treturn v[0], nil\n\tcase 0:\n\t\terr = &NotFoundError{s.label}\n\tdefault:\n\t\terr = fmt.Errorf(\"ent: Float64s returned %d results when one was expected\", len(v))\n\t}\n\treturn\n}\n\n// Float64X is like Float64, but panics if an error occurs.\nfunc (s *selector) Float64X(ctx context.Context) float64 {\n\tv, err := s.Float64(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// Bools returns list of bools from a selector. It is only allowed when selecting one field.\nfunc (s *selector) Bools(ctx context.Context) ([]bool, error) {\n\tif len(*s.flds) > 1 {\n\t\treturn nil, errors.New(\"ent: Bools is not achievable when selecting more than 1 field\")\n\t}\n\tvar v []bool\n\tif err := s.scan(ctx, &v); err != nil {\n\t\treturn nil, err\n\t}\n\treturn v, nil\n}\n\n// BoolsX is like Bools, but panics if an error occurs.\nfunc (s *selector) BoolsX(ctx context.Context) []bool {\n\tv, err := s.Bools(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// Bool returns a single bool from a selector. It is only allowed when selecting one field.\nfunc (s *selector) Bool(ctx context.Context) (_ bool, err error) {\n\tvar v []bool\n\tif v, err = s.Bools(ctx); err != nil {\n\t\treturn\n\t}\n\tswitch len(v) {\n\tcase 1:\n\t\treturn v[0], nil\n\tcase 0:\n\t\terr = &NotFoundError{s.label}\n\tdefault:\n\t\terr = fmt.Errorf(\"ent: Bools returned %d results when one was expected\", len(v))\n\t}\n\treturn\n}\n\n// BoolX is like Bool, but panics if an error occurs.\nfunc (s *selector) BoolX(ctx context.Context) bool {\n\tv, err := s.Bool(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// queryHook describes an internal hook for the different sqlAll methods.\ntype queryHook func(context.Context, *sqlgraph.QuerySpec)\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/enttest/enttest.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage enttest\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent\"\n\t// required by schema hooks.\n\t_ \"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/runtime\"\n\n\t\"entgo.io/ent/dialect/sql/schema\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/migrate\"\n)\n\ntype (\n\t// TestingT is the interface that is shared between\n\t// testing.T and testing.B and used by enttest.\n\tTestingT interface {\n\t\tFailNow()\n\t\tError(...any)\n\t}\n\n\t// Option configures client creation.\n\tOption func(*options)\n\n\toptions struct {\n\t\topts        []ent.Option\n\t\tmigrateOpts []schema.MigrateOption\n\t}\n)\n\n// WithOptions forwards options to client creation.\nfunc WithOptions(opts ...ent.Option) Option {\n\treturn func(o *options) {\n\t\to.opts = append(o.opts, opts...)\n\t}\n}\n\n// WithMigrateOptions forwards options to auto migration.\nfunc WithMigrateOptions(opts ...schema.MigrateOption) Option {\n\treturn func(o *options) {\n\t\to.migrateOpts = append(o.migrateOpts, opts...)\n\t}\n}\n\nfunc newOptions(opts []Option) *options {\n\to := &options{}\n\tfor _, opt := range opts {\n\t\topt(o)\n\t}\n\treturn o\n}\n\n// Open calls ent.Open and auto-run migration.\nfunc Open(t TestingT, driverName, dataSourceName string, opts ...Option) *ent.Client {\n\to := newOptions(opts)\n\tc, err := ent.Open(driverName, dataSourceName, o.opts...)\n\tif err != nil {\n\t\tt.Error(err)\n\t\tt.FailNow()\n\t}\n\tmigrateSchema(t, c, o)\n\treturn c\n}\n\n// NewClient calls ent.NewClient and auto-run migration.\nfunc NewClient(t TestingT, opts ...Option) *ent.Client {\n\to := newOptions(opts)\n\tc := ent.NewClient(o.opts...)\n\tmigrateSchema(t, c, o)\n\treturn c\n}\nfunc migrateSchema(t TestingT, c *ent.Client, o *options) {\n\ttables, err := schema.CopyTables(migrate.Tables)\n\tif err != nil {\n\t\tt.Error(err)\n\t\tt.FailNow()\n\t}\n\tif err := migrate.Create(context.Background(), c.Schema, tables, o.migrateOpts...); err != nil {\n\t\tt.Error(err)\n\t\tt.FailNow()\n\t}\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/generate.go",
    "content": "package ent\n\n//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate ./schema\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/hook/hook.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage hook\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent\"\n)\n\n// The OrderFunc type is an adapter to allow the use of ordinary\n// function as Order mutator.\ntype OrderFunc func(context.Context, *ent.OrderMutation) (ent.Value, error)\n\n// Mutate calls f(ctx, m).\nfunc (f OrderFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {\n\tmv, ok := m.(*ent.OrderMutation)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unexpected mutation type %T. expect *ent.OrderMutation\", m)\n\t}\n\treturn f(ctx, mv)\n}\n\n// Condition is a hook condition function.\ntype Condition func(context.Context, ent.Mutation) bool\n\n// And groups conditions with the AND operator.\nfunc And(first, second Condition, rest ...Condition) Condition {\n\treturn func(ctx context.Context, m ent.Mutation) bool {\n\t\tif !first(ctx, m) || !second(ctx, m) {\n\t\t\treturn false\n\t\t}\n\t\tfor _, cond := range rest {\n\t\t\tif !cond(ctx, m) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n}\n\n// Or groups conditions with the OR operator.\nfunc Or(first, second Condition, rest ...Condition) Condition {\n\treturn func(ctx context.Context, m ent.Mutation) bool {\n\t\tif first(ctx, m) || second(ctx, m) {\n\t\t\treturn true\n\t\t}\n\t\tfor _, cond := range rest {\n\t\t\tif cond(ctx, m) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n}\n\n// Not negates a given condition.\nfunc Not(cond Condition) Condition {\n\treturn func(ctx context.Context, m ent.Mutation) bool {\n\t\treturn !cond(ctx, m)\n\t}\n}\n\n// HasOp is a condition testing mutation operation.\nfunc HasOp(op ent.Op) Condition {\n\treturn func(_ context.Context, m ent.Mutation) bool {\n\t\treturn m.Op().Is(op)\n\t}\n}\n\n// HasAddedFields is a condition validating `.AddedField` on fields.\nfunc HasAddedFields(field string, fields ...string) Condition {\n\treturn func(_ context.Context, m ent.Mutation) bool {\n\t\tif _, exists := m.AddedField(field); !exists {\n\t\t\treturn false\n\t\t}\n\t\tfor _, field := range fields {\n\t\t\tif _, exists := m.AddedField(field); !exists {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n}\n\n// HasClearedFields is a condition validating `.FieldCleared` on fields.\nfunc HasClearedFields(field string, fields ...string) Condition {\n\treturn func(_ context.Context, m ent.Mutation) bool {\n\t\tif exists := m.FieldCleared(field); !exists {\n\t\t\treturn false\n\t\t}\n\t\tfor _, field := range fields {\n\t\t\tif exists := m.FieldCleared(field); !exists {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n}\n\n// HasFields is a condition validating `.Field` on fields.\nfunc HasFields(field string, fields ...string) Condition {\n\treturn func(_ context.Context, m ent.Mutation) bool {\n\t\tif _, exists := m.Field(field); !exists {\n\t\t\treturn false\n\t\t}\n\t\tfor _, field := range fields {\n\t\t\tif _, exists := m.Field(field); !exists {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n}\n\n// If executes the given hook under condition.\n//\n//\thook.If(ComputeAverage, And(HasFields(...), HasAddedFields(...)))\nfunc If(hk ent.Hook, cond Condition) ent.Hook {\n\treturn func(next ent.Mutator) ent.Mutator {\n\t\treturn ent.MutateFunc(func(ctx context.Context, m ent.Mutation) (ent.Value, error) {\n\t\t\tif cond(ctx, m) {\n\t\t\t\treturn hk(next).Mutate(ctx, m)\n\t\t\t}\n\t\t\treturn next.Mutate(ctx, m)\n\t\t})\n\t}\n}\n\n// On executes the given hook only for the given operation.\n//\n//\thook.On(Log, ent.Delete|ent.Create)\nfunc On(hk ent.Hook, op ent.Op) ent.Hook {\n\treturn If(hk, HasOp(op))\n}\n\n// Unless skips the given hook only for the given operation.\n//\n//\thook.Unless(Log, ent.Update|ent.UpdateOne)\nfunc Unless(hk ent.Hook, op ent.Op) ent.Hook {\n\treturn If(hk, Not(HasOp(op)))\n}\n\n// FixedError is a hook returning a fixed error.\nfunc FixedError(err error) ent.Hook {\n\treturn func(ent.Mutator) ent.Mutator {\n\t\treturn ent.MutateFunc(func(context.Context, ent.Mutation) (ent.Value, error) {\n\t\t\treturn nil, err\n\t\t})\n\t}\n}\n\n// Reject returns a hook that rejects all operations that match op.\n//\n//\tfunc (T) Hooks() []ent.Hook {\n//\t\treturn []ent.Hook{\n//\t\t\tReject(ent.Delete|ent.Update),\n//\t\t}\n//\t}\nfunc Reject(op ent.Op) ent.Hook {\n\thk := FixedError(fmt.Errorf(\"%s operation is not allowed\", op))\n\treturn On(hk, op)\n}\n\n// Chain acts as a list of hooks and is effectively immutable.\n// Once created, it will always hold the same set of hooks in the same order.\ntype Chain struct {\n\thooks []ent.Hook\n}\n\n// NewChain creates a new chain of hooks.\nfunc NewChain(hooks ...ent.Hook) Chain {\n\treturn Chain{append([]ent.Hook(nil), hooks...)}\n}\n\n// Hook chains the list of hooks and returns the final hook.\nfunc (c Chain) Hook() ent.Hook {\n\treturn func(mutator ent.Mutator) ent.Mutator {\n\t\tfor i := len(c.hooks) - 1; i >= 0; i-- {\n\t\t\tmutator = c.hooks[i](mutator)\n\t\t}\n\t\treturn mutator\n\t}\n}\n\n// Append extends a chain, adding the specified hook\n// as the last ones in the mutation flow.\nfunc (c Chain) Append(hooks ...ent.Hook) Chain {\n\tnewHooks := make([]ent.Hook, 0, len(c.hooks)+len(hooks))\n\tnewHooks = append(newHooks, c.hooks...)\n\tnewHooks = append(newHooks, hooks...)\n\treturn Chain{newHooks}\n}\n\n// Extend extends a chain, adding the specified chain\n// as the last ones in the mutation flow.\nfunc (c Chain) Extend(chain Chain) Chain {\n\treturn c.Append(chain.hooks...)\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/migrate/migrate.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage migrate\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"entgo.io/ent/dialect\"\n\t\"entgo.io/ent/dialect/sql/schema\"\n)\n\nvar (\n\t// WithGlobalUniqueID sets the universal ids options to the migration.\n\t// If this option is enabled, ent migration will allocate a 1<<32 range\n\t// for the ids of each entity (table).\n\t// Note that this option cannot be applied on tables that already exist.\n\tWithGlobalUniqueID = schema.WithGlobalUniqueID\n\t// WithDropColumn sets the drop column option to the migration.\n\t// If this option is enabled, ent migration will drop old columns\n\t// that were used for both fields and edges. This defaults to false.\n\tWithDropColumn = schema.WithDropColumn\n\t// WithDropIndex sets the drop index option to the migration.\n\t// If this option is enabled, ent migration will drop old indexes\n\t// that were defined in the schema. This defaults to false.\n\t// Note that unique constraints are defined using `UNIQUE INDEX`,\n\t// and therefore, it's recommended to enable this option to get more\n\t// flexibility in the schema changes.\n\tWithDropIndex = schema.WithDropIndex\n\t// WithForeignKeys enables creating foreign-key in schema DDL. This defaults to true.\n\tWithForeignKeys = schema.WithForeignKeys\n)\n\n// Schema is the API for creating, migrating and dropping a schema.\ntype Schema struct {\n\tdrv dialect.Driver\n}\n\n// NewSchema creates a new schema client.\nfunc NewSchema(drv dialect.Driver) *Schema { return &Schema{drv: drv} }\n\n// Create creates all schema resources.\nfunc (s *Schema) Create(ctx context.Context, opts ...schema.MigrateOption) error {\n\treturn Create(ctx, s, Tables, opts...)\n}\n\n// Create creates all table resources using the given schema driver.\nfunc Create(ctx context.Context, s *Schema, tables []*schema.Table, opts ...schema.MigrateOption) error {\n\tmigrate, err := schema.NewMigrate(s.drv, opts...)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"ent/migrate: %w\", err)\n\t}\n\treturn migrate.Create(ctx, tables...)\n}\n\n// WriteTo writes the schema changes to w instead of running them against the database.\n//\n//\tif err := client.Schema.WriteTo(context.Background(), os.Stdout); err != nil {\n//\t\tlog.Fatal(err)\n//\t}\nfunc (s *Schema) WriteTo(ctx context.Context, w io.Writer, opts ...schema.MigrateOption) error {\n\treturn Create(ctx, &Schema{drv: &schema.WriteDriver{Writer: w, Driver: s.drv}}, Tables, opts...)\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/migrate/schema.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage migrate\n\nimport (\n\t\"entgo.io/ent/dialect/sql/schema\"\n\t\"entgo.io/ent/schema/field\"\n)\n\nvar (\n\t// OrdersColumns holds the columns for the \"orders\" table.\n\tOrdersColumns = []*schema.Column{\n\t\t{Name: \"id\", Type: field.TypeInt, Increment: true},\n\t\t{Name: \"merchant_id\", Type: field.TypeString},\n\t\t{Name: \"channel\", Type: field.TypeString},\n\t\t{Name: \"pay_way\", Type: field.TypeString},\n\t\t{Name: \"out_order_no\", Type: field.TypeString},\n\t\t{Name: \"total_amount\", Type: field.TypeUint64},\n\t\t{Name: \"body\", Type: field.TypeString},\n\t\t{Name: \"order_status\", Type: field.TypeInt8},\n\t\t{Name: \"auth_code\", Type: field.TypeString},\n\t\t{Name: \"wx_appid\", Type: field.TypeString},\n\t\t{Name: \"sub_openid\", Type: field.TypeString},\n\t\t{Name: \"jump_url\", Type: field.TypeString},\n\t\t{Name: \"notify_url\", Type: field.TypeString},\n\t\t{Name: \"client_ip\", Type: field.TypeString},\n\t\t{Name: \"attach\", Type: field.TypeString},\n\t\t{Name: \"order_expiration\", Type: field.TypeString},\n\t\t{Name: \"extend_params\", Type: field.TypeString},\n\t}\n\t// OrdersTable holds the schema information for the \"orders\" table.\n\tOrdersTable = &schema.Table{\n\t\tName:       \"orders\",\n\t\tColumns:    OrdersColumns,\n\t\tPrimaryKey: []*schema.Column{OrdersColumns[0]},\n\t}\n\t// Tables holds all the tables in the schema.\n\tTables = []*schema.Table{\n\t\tOrdersTable,\n\t}\n)\n\nfunc init() {\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/mutation.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/order\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/predicate\"\n\n\t\"entgo.io/ent\"\n)\n\nconst (\n\t// Operation types.\n\tOpCreate    = ent.OpCreate\n\tOpDelete    = ent.OpDelete\n\tOpDeleteOne = ent.OpDeleteOne\n\tOpUpdate    = ent.OpUpdate\n\tOpUpdateOne = ent.OpUpdateOne\n\n\t// Node types.\n\tTypeOrder = \"Order\"\n)\n\n// OrderMutation represents an operation that mutates the Order nodes in the graph.\ntype OrderMutation struct {\n\tconfig\n\top               Op\n\ttyp              string\n\tid               *int\n\tmerchant_id      *string\n\tchannel          *string\n\tpay_way          *string\n\tout_order_no     *string\n\ttotal_amount     *uint64\n\taddtotal_amount  *int64\n\tbody             *string\n\torder_status     *int8\n\taddorder_status  *int8\n\tauth_code        *string\n\twx_appid         *string\n\tsub_openid       *string\n\tjump_url         *string\n\tnotify_url       *string\n\tclient_ip        *string\n\tattach           *string\n\torder_expiration *string\n\textend_params    *string\n\tclearedFields    map[string]struct{}\n\tdone             bool\n\toldValue         func(context.Context) (*Order, error)\n\tpredicates       []predicate.Order\n}\n\nvar _ ent.Mutation = (*OrderMutation)(nil)\n\n// orderOption allows management of the mutation configuration using functional options.\ntype orderOption func(*OrderMutation)\n\n// newOrderMutation creates new mutation for the Order entity.\nfunc newOrderMutation(c config, op Op, opts ...orderOption) *OrderMutation {\n\tm := &OrderMutation{\n\t\tconfig:        c,\n\t\top:            op,\n\t\ttyp:           TypeOrder,\n\t\tclearedFields: make(map[string]struct{}),\n\t}\n\tfor _, opt := range opts {\n\t\topt(m)\n\t}\n\treturn m\n}\n\n// withOrderID sets the ID field of the mutation.\nfunc withOrderID(id int) orderOption {\n\treturn func(m *OrderMutation) {\n\t\tvar (\n\t\t\terr   error\n\t\t\tonce  sync.Once\n\t\t\tvalue *Order\n\t\t)\n\t\tm.oldValue = func(ctx context.Context) (*Order, error) {\n\t\t\tonce.Do(func() {\n\t\t\t\tif m.done {\n\t\t\t\t\terr = errors.New(\"querying old values post mutation is not allowed\")\n\t\t\t\t} else {\n\t\t\t\t\tvalue, err = m.Client().Order.Get(ctx, id)\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn value, err\n\t\t}\n\t\tm.id = &id\n\t}\n}\n\n// withOrder sets the old Order of the mutation.\nfunc withOrder(node *Order) orderOption {\n\treturn func(m *OrderMutation) {\n\t\tm.oldValue = func(context.Context) (*Order, error) {\n\t\t\treturn node, nil\n\t\t}\n\t\tm.id = &node.ID\n\t}\n}\n\n// Client returns a new `ent.Client` from the mutation. If the mutation was\n// executed in a transaction (ent.Tx), a transactional client is returned.\nfunc (m OrderMutation) Client() *Client {\n\tclient := &Client{config: m.config}\n\tclient.init()\n\treturn client\n}\n\n// Tx returns an `ent.Tx` for mutations that were executed in transactions;\n// it returns an error otherwise.\nfunc (m OrderMutation) Tx() (*Tx, error) {\n\tif _, ok := m.driver.(*txDriver); !ok {\n\t\treturn nil, errors.New(\"ent: mutation is not running in a transaction\")\n\t}\n\ttx := &Tx{config: m.config}\n\ttx.init()\n\treturn tx, nil\n}\n\n// ID returns the ID value in the mutation. Note that the ID is only available\n// if it was provided to the builder or after it was returned from the database.\nfunc (m *OrderMutation) ID() (id int, exists bool) {\n\tif m.id == nil {\n\t\treturn\n\t}\n\treturn *m.id, true\n}\n\n// IDs queries the database and returns the entity ids that match the mutation's predicate.\n// That means, if the mutation is applied within a transaction with an isolation level such\n// as sql.LevelSerializable, the returned ids match the ids of the rows that will be updated\n// or updated by the mutation.\nfunc (m *OrderMutation) IDs(ctx context.Context) ([]int, error) {\n\tswitch {\n\tcase m.op.Is(OpUpdateOne | OpDeleteOne):\n\t\tid, exists := m.ID()\n\t\tif exists {\n\t\t\treturn []int{id}, nil\n\t\t}\n\t\tfallthrough\n\tcase m.op.Is(OpUpdate | OpDelete):\n\t\treturn m.Client().Order.Query().Where(m.predicates...).IDs(ctx)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"IDs is not allowed on %s operations\", m.op)\n\t}\n}\n\n// SetMerchantID sets the \"merchant_id\" field.\nfunc (m *OrderMutation) SetMerchantID(s string) {\n\tm.merchant_id = &s\n}\n\n// MerchantID returns the value of the \"merchant_id\" field in the mutation.\nfunc (m *OrderMutation) MerchantID() (r string, exists bool) {\n\tv := m.merchant_id\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldMerchantID returns the old \"merchant_id\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldMerchantID(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldMerchantID is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldMerchantID requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldMerchantID: %w\", err)\n\t}\n\treturn oldValue.MerchantID, nil\n}\n\n// ResetMerchantID resets all changes to the \"merchant_id\" field.\nfunc (m *OrderMutation) ResetMerchantID() {\n\tm.merchant_id = nil\n}\n\n// SetChannel sets the \"channel\" field.\nfunc (m *OrderMutation) SetChannel(s string) {\n\tm.channel = &s\n}\n\n// Channel returns the value of the \"channel\" field in the mutation.\nfunc (m *OrderMutation) Channel() (r string, exists bool) {\n\tv := m.channel\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldChannel returns the old \"channel\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldChannel(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldChannel is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldChannel requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldChannel: %w\", err)\n\t}\n\treturn oldValue.Channel, nil\n}\n\n// ResetChannel resets all changes to the \"channel\" field.\nfunc (m *OrderMutation) ResetChannel() {\n\tm.channel = nil\n}\n\n// SetPayWay sets the \"pay_way\" field.\nfunc (m *OrderMutation) SetPayWay(s string) {\n\tm.pay_way = &s\n}\n\n// PayWay returns the value of the \"pay_way\" field in the mutation.\nfunc (m *OrderMutation) PayWay() (r string, exists bool) {\n\tv := m.pay_way\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldPayWay returns the old \"pay_way\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldPayWay(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldPayWay is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldPayWay requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldPayWay: %w\", err)\n\t}\n\treturn oldValue.PayWay, nil\n}\n\n// ResetPayWay resets all changes to the \"pay_way\" field.\nfunc (m *OrderMutation) ResetPayWay() {\n\tm.pay_way = nil\n}\n\n// SetOutOrderNo sets the \"out_order_no\" field.\nfunc (m *OrderMutation) SetOutOrderNo(s string) {\n\tm.out_order_no = &s\n}\n\n// OutOrderNo returns the value of the \"out_order_no\" field in the mutation.\nfunc (m *OrderMutation) OutOrderNo() (r string, exists bool) {\n\tv := m.out_order_no\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldOutOrderNo returns the old \"out_order_no\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldOutOrderNo(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldOutOrderNo is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldOutOrderNo requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldOutOrderNo: %w\", err)\n\t}\n\treturn oldValue.OutOrderNo, nil\n}\n\n// ResetOutOrderNo resets all changes to the \"out_order_no\" field.\nfunc (m *OrderMutation) ResetOutOrderNo() {\n\tm.out_order_no = nil\n}\n\n// SetTotalAmount sets the \"total_amount\" field.\nfunc (m *OrderMutation) SetTotalAmount(u uint64) {\n\tm.total_amount = &u\n\tm.addtotal_amount = nil\n}\n\n// TotalAmount returns the value of the \"total_amount\" field in the mutation.\nfunc (m *OrderMutation) TotalAmount() (r uint64, exists bool) {\n\tv := m.total_amount\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldTotalAmount returns the old \"total_amount\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldTotalAmount(ctx context.Context) (v uint64, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldTotalAmount is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldTotalAmount requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldTotalAmount: %w\", err)\n\t}\n\treturn oldValue.TotalAmount, nil\n}\n\n// AddTotalAmount adds u to the \"total_amount\" field.\nfunc (m *OrderMutation) AddTotalAmount(u int64) {\n\tif m.addtotal_amount != nil {\n\t\t*m.addtotal_amount += u\n\t} else {\n\t\tm.addtotal_amount = &u\n\t}\n}\n\n// AddedTotalAmount returns the value that was added to the \"total_amount\" field in this mutation.\nfunc (m *OrderMutation) AddedTotalAmount() (r int64, exists bool) {\n\tv := m.addtotal_amount\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// ResetTotalAmount resets all changes to the \"total_amount\" field.\nfunc (m *OrderMutation) ResetTotalAmount() {\n\tm.total_amount = nil\n\tm.addtotal_amount = nil\n}\n\n// SetBody sets the \"body\" field.\nfunc (m *OrderMutation) SetBody(s string) {\n\tm.body = &s\n}\n\n// Body returns the value of the \"body\" field in the mutation.\nfunc (m *OrderMutation) Body() (r string, exists bool) {\n\tv := m.body\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldBody returns the old \"body\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldBody(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldBody is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldBody requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldBody: %w\", err)\n\t}\n\treturn oldValue.Body, nil\n}\n\n// ResetBody resets all changes to the \"body\" field.\nfunc (m *OrderMutation) ResetBody() {\n\tm.body = nil\n}\n\n// SetOrderStatus sets the \"order_status\" field.\nfunc (m *OrderMutation) SetOrderStatus(i int8) {\n\tm.order_status = &i\n\tm.addorder_status = nil\n}\n\n// OrderStatus returns the value of the \"order_status\" field in the mutation.\nfunc (m *OrderMutation) OrderStatus() (r int8, exists bool) {\n\tv := m.order_status\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldOrderStatus returns the old \"order_status\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldOrderStatus(ctx context.Context) (v int8, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldOrderStatus is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldOrderStatus requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldOrderStatus: %w\", err)\n\t}\n\treturn oldValue.OrderStatus, nil\n}\n\n// AddOrderStatus adds i to the \"order_status\" field.\nfunc (m *OrderMutation) AddOrderStatus(i int8) {\n\tif m.addorder_status != nil {\n\t\t*m.addorder_status += i\n\t} else {\n\t\tm.addorder_status = &i\n\t}\n}\n\n// AddedOrderStatus returns the value that was added to the \"order_status\" field in this mutation.\nfunc (m *OrderMutation) AddedOrderStatus() (r int8, exists bool) {\n\tv := m.addorder_status\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// ResetOrderStatus resets all changes to the \"order_status\" field.\nfunc (m *OrderMutation) ResetOrderStatus() {\n\tm.order_status = nil\n\tm.addorder_status = nil\n}\n\n// SetAuthCode sets the \"auth_code\" field.\nfunc (m *OrderMutation) SetAuthCode(s string) {\n\tm.auth_code = &s\n}\n\n// AuthCode returns the value of the \"auth_code\" field in the mutation.\nfunc (m *OrderMutation) AuthCode() (r string, exists bool) {\n\tv := m.auth_code\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldAuthCode returns the old \"auth_code\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldAuthCode(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldAuthCode is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldAuthCode requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldAuthCode: %w\", err)\n\t}\n\treturn oldValue.AuthCode, nil\n}\n\n// ResetAuthCode resets all changes to the \"auth_code\" field.\nfunc (m *OrderMutation) ResetAuthCode() {\n\tm.auth_code = nil\n}\n\n// SetWxAppid sets the \"wx_appid\" field.\nfunc (m *OrderMutation) SetWxAppid(s string) {\n\tm.wx_appid = &s\n}\n\n// WxAppid returns the value of the \"wx_appid\" field in the mutation.\nfunc (m *OrderMutation) WxAppid() (r string, exists bool) {\n\tv := m.wx_appid\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldWxAppid returns the old \"wx_appid\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldWxAppid(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldWxAppid is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldWxAppid requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldWxAppid: %w\", err)\n\t}\n\treturn oldValue.WxAppid, nil\n}\n\n// ResetWxAppid resets all changes to the \"wx_appid\" field.\nfunc (m *OrderMutation) ResetWxAppid() {\n\tm.wx_appid = nil\n}\n\n// SetSubOpenid sets the \"sub_openid\" field.\nfunc (m *OrderMutation) SetSubOpenid(s string) {\n\tm.sub_openid = &s\n}\n\n// SubOpenid returns the value of the \"sub_openid\" field in the mutation.\nfunc (m *OrderMutation) SubOpenid() (r string, exists bool) {\n\tv := m.sub_openid\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldSubOpenid returns the old \"sub_openid\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldSubOpenid(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldSubOpenid is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldSubOpenid requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldSubOpenid: %w\", err)\n\t}\n\treturn oldValue.SubOpenid, nil\n}\n\n// ResetSubOpenid resets all changes to the \"sub_openid\" field.\nfunc (m *OrderMutation) ResetSubOpenid() {\n\tm.sub_openid = nil\n}\n\n// SetJumpURL sets the \"jump_url\" field.\nfunc (m *OrderMutation) SetJumpURL(s string) {\n\tm.jump_url = &s\n}\n\n// JumpURL returns the value of the \"jump_url\" field in the mutation.\nfunc (m *OrderMutation) JumpURL() (r string, exists bool) {\n\tv := m.jump_url\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldJumpURL returns the old \"jump_url\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldJumpURL(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldJumpURL is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldJumpURL requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldJumpURL: %w\", err)\n\t}\n\treturn oldValue.JumpURL, nil\n}\n\n// ResetJumpURL resets all changes to the \"jump_url\" field.\nfunc (m *OrderMutation) ResetJumpURL() {\n\tm.jump_url = nil\n}\n\n// SetNotifyURL sets the \"notify_url\" field.\nfunc (m *OrderMutation) SetNotifyURL(s string) {\n\tm.notify_url = &s\n}\n\n// NotifyURL returns the value of the \"notify_url\" field in the mutation.\nfunc (m *OrderMutation) NotifyURL() (r string, exists bool) {\n\tv := m.notify_url\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldNotifyURL returns the old \"notify_url\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldNotifyURL(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldNotifyURL is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldNotifyURL requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldNotifyURL: %w\", err)\n\t}\n\treturn oldValue.NotifyURL, nil\n}\n\n// ResetNotifyURL resets all changes to the \"notify_url\" field.\nfunc (m *OrderMutation) ResetNotifyURL() {\n\tm.notify_url = nil\n}\n\n// SetClientIP sets the \"client_ip\" field.\nfunc (m *OrderMutation) SetClientIP(s string) {\n\tm.client_ip = &s\n}\n\n// ClientIP returns the value of the \"client_ip\" field in the mutation.\nfunc (m *OrderMutation) ClientIP() (r string, exists bool) {\n\tv := m.client_ip\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldClientIP returns the old \"client_ip\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldClientIP(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldClientIP is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldClientIP requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldClientIP: %w\", err)\n\t}\n\treturn oldValue.ClientIP, nil\n}\n\n// ResetClientIP resets all changes to the \"client_ip\" field.\nfunc (m *OrderMutation) ResetClientIP() {\n\tm.client_ip = nil\n}\n\n// SetAttach sets the \"attach\" field.\nfunc (m *OrderMutation) SetAttach(s string) {\n\tm.attach = &s\n}\n\n// Attach returns the value of the \"attach\" field in the mutation.\nfunc (m *OrderMutation) Attach() (r string, exists bool) {\n\tv := m.attach\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldAttach returns the old \"attach\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldAttach(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldAttach is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldAttach requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldAttach: %w\", err)\n\t}\n\treturn oldValue.Attach, nil\n}\n\n// ResetAttach resets all changes to the \"attach\" field.\nfunc (m *OrderMutation) ResetAttach() {\n\tm.attach = nil\n}\n\n// SetOrderExpiration sets the \"order_expiration\" field.\nfunc (m *OrderMutation) SetOrderExpiration(s string) {\n\tm.order_expiration = &s\n}\n\n// OrderExpiration returns the value of the \"order_expiration\" field in the mutation.\nfunc (m *OrderMutation) OrderExpiration() (r string, exists bool) {\n\tv := m.order_expiration\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldOrderExpiration returns the old \"order_expiration\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldOrderExpiration(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldOrderExpiration is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldOrderExpiration requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldOrderExpiration: %w\", err)\n\t}\n\treturn oldValue.OrderExpiration, nil\n}\n\n// ResetOrderExpiration resets all changes to the \"order_expiration\" field.\nfunc (m *OrderMutation) ResetOrderExpiration() {\n\tm.order_expiration = nil\n}\n\n// SetExtendParams sets the \"extend_params\" field.\nfunc (m *OrderMutation) SetExtendParams(s string) {\n\tm.extend_params = &s\n}\n\n// ExtendParams returns the value of the \"extend_params\" field in the mutation.\nfunc (m *OrderMutation) ExtendParams() (r string, exists bool) {\n\tv := m.extend_params\n\tif v == nil {\n\t\treturn\n\t}\n\treturn *v, true\n}\n\n// OldExtendParams returns the old \"extend_params\" field's value of the Order entity.\n// If the Order object wasn't provided to the builder, the object is fetched from the database.\n// An error is returned if the mutation operation is not UpdateOne, or the database query fails.\nfunc (m *OrderMutation) OldExtendParams(ctx context.Context) (v string, err error) {\n\tif !m.op.Is(OpUpdateOne) {\n\t\treturn v, errors.New(\"OldExtendParams is only allowed on UpdateOne operations\")\n\t}\n\tif m.id == nil || m.oldValue == nil {\n\t\treturn v, errors.New(\"OldExtendParams requires an ID field in the mutation\")\n\t}\n\toldValue, err := m.oldValue(ctx)\n\tif err != nil {\n\t\treturn v, fmt.Errorf(\"querying old value for OldExtendParams: %w\", err)\n\t}\n\treturn oldValue.ExtendParams, nil\n}\n\n// ResetExtendParams resets all changes to the \"extend_params\" field.\nfunc (m *OrderMutation) ResetExtendParams() {\n\tm.extend_params = nil\n}\n\n// Where appends a list predicates to the OrderMutation builder.\nfunc (m *OrderMutation) Where(ps ...predicate.Order) {\n\tm.predicates = append(m.predicates, ps...)\n}\n\n// Op returns the operation name.\nfunc (m *OrderMutation) Op() Op {\n\treturn m.op\n}\n\n// Type returns the node type of this mutation (Order).\nfunc (m *OrderMutation) Type() string {\n\treturn m.typ\n}\n\n// Fields returns all fields that were changed during this mutation. Note that in\n// order to get all numeric fields that were incremented/decremented, call\n// AddedFields().\nfunc (m *OrderMutation) Fields() []string {\n\tfields := make([]string, 0, 16)\n\tif m.merchant_id != nil {\n\t\tfields = append(fields, order.FieldMerchantID)\n\t}\n\tif m.channel != nil {\n\t\tfields = append(fields, order.FieldChannel)\n\t}\n\tif m.pay_way != nil {\n\t\tfields = append(fields, order.FieldPayWay)\n\t}\n\tif m.out_order_no != nil {\n\t\tfields = append(fields, order.FieldOutOrderNo)\n\t}\n\tif m.total_amount != nil {\n\t\tfields = append(fields, order.FieldTotalAmount)\n\t}\n\tif m.body != nil {\n\t\tfields = append(fields, order.FieldBody)\n\t}\n\tif m.order_status != nil {\n\t\tfields = append(fields, order.FieldOrderStatus)\n\t}\n\tif m.auth_code != nil {\n\t\tfields = append(fields, order.FieldAuthCode)\n\t}\n\tif m.wx_appid != nil {\n\t\tfields = append(fields, order.FieldWxAppid)\n\t}\n\tif m.sub_openid != nil {\n\t\tfields = append(fields, order.FieldSubOpenid)\n\t}\n\tif m.jump_url != nil {\n\t\tfields = append(fields, order.FieldJumpURL)\n\t}\n\tif m.notify_url != nil {\n\t\tfields = append(fields, order.FieldNotifyURL)\n\t}\n\tif m.client_ip != nil {\n\t\tfields = append(fields, order.FieldClientIP)\n\t}\n\tif m.attach != nil {\n\t\tfields = append(fields, order.FieldAttach)\n\t}\n\tif m.order_expiration != nil {\n\t\tfields = append(fields, order.FieldOrderExpiration)\n\t}\n\tif m.extend_params != nil {\n\t\tfields = append(fields, order.FieldExtendParams)\n\t}\n\treturn fields\n}\n\n// Field returns the value of a field with the given name. The second boolean\n// return value indicates that this field was not set, or was not defined in the\n// schema.\nfunc (m *OrderMutation) Field(name string) (ent.Value, bool) {\n\tswitch name {\n\tcase order.FieldMerchantID:\n\t\treturn m.MerchantID()\n\tcase order.FieldChannel:\n\t\treturn m.Channel()\n\tcase order.FieldPayWay:\n\t\treturn m.PayWay()\n\tcase order.FieldOutOrderNo:\n\t\treturn m.OutOrderNo()\n\tcase order.FieldTotalAmount:\n\t\treturn m.TotalAmount()\n\tcase order.FieldBody:\n\t\treturn m.Body()\n\tcase order.FieldOrderStatus:\n\t\treturn m.OrderStatus()\n\tcase order.FieldAuthCode:\n\t\treturn m.AuthCode()\n\tcase order.FieldWxAppid:\n\t\treturn m.WxAppid()\n\tcase order.FieldSubOpenid:\n\t\treturn m.SubOpenid()\n\tcase order.FieldJumpURL:\n\t\treturn m.JumpURL()\n\tcase order.FieldNotifyURL:\n\t\treturn m.NotifyURL()\n\tcase order.FieldClientIP:\n\t\treturn m.ClientIP()\n\tcase order.FieldAttach:\n\t\treturn m.Attach()\n\tcase order.FieldOrderExpiration:\n\t\treturn m.OrderExpiration()\n\tcase order.FieldExtendParams:\n\t\treturn m.ExtendParams()\n\t}\n\treturn nil, false\n}\n\n// OldField returns the old value of the field from the database. An error is\n// returned if the mutation operation is not UpdateOne, or the query to the\n// database failed.\nfunc (m *OrderMutation) OldField(ctx context.Context, name string) (ent.Value, error) {\n\tswitch name {\n\tcase order.FieldMerchantID:\n\t\treturn m.OldMerchantID(ctx)\n\tcase order.FieldChannel:\n\t\treturn m.OldChannel(ctx)\n\tcase order.FieldPayWay:\n\t\treturn m.OldPayWay(ctx)\n\tcase order.FieldOutOrderNo:\n\t\treturn m.OldOutOrderNo(ctx)\n\tcase order.FieldTotalAmount:\n\t\treturn m.OldTotalAmount(ctx)\n\tcase order.FieldBody:\n\t\treturn m.OldBody(ctx)\n\tcase order.FieldOrderStatus:\n\t\treturn m.OldOrderStatus(ctx)\n\tcase order.FieldAuthCode:\n\t\treturn m.OldAuthCode(ctx)\n\tcase order.FieldWxAppid:\n\t\treturn m.OldWxAppid(ctx)\n\tcase order.FieldSubOpenid:\n\t\treturn m.OldSubOpenid(ctx)\n\tcase order.FieldJumpURL:\n\t\treturn m.OldJumpURL(ctx)\n\tcase order.FieldNotifyURL:\n\t\treturn m.OldNotifyURL(ctx)\n\tcase order.FieldClientIP:\n\t\treturn m.OldClientIP(ctx)\n\tcase order.FieldAttach:\n\t\treturn m.OldAttach(ctx)\n\tcase order.FieldOrderExpiration:\n\t\treturn m.OldOrderExpiration(ctx)\n\tcase order.FieldExtendParams:\n\t\treturn m.OldExtendParams(ctx)\n\t}\n\treturn nil, fmt.Errorf(\"unknown Order field %s\", name)\n}\n\n// SetField sets the value of a field with the given name. It returns an error if\n// the field is not defined in the schema, or if the type mismatched the field\n// type.\nfunc (m *OrderMutation) SetField(name string, value ent.Value) error {\n\tswitch name {\n\tcase order.FieldMerchantID:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetMerchantID(v)\n\t\treturn nil\n\tcase order.FieldChannel:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetChannel(v)\n\t\treturn nil\n\tcase order.FieldPayWay:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetPayWay(v)\n\t\treturn nil\n\tcase order.FieldOutOrderNo:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetOutOrderNo(v)\n\t\treturn nil\n\tcase order.FieldTotalAmount:\n\t\tv, ok := value.(uint64)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetTotalAmount(v)\n\t\treturn nil\n\tcase order.FieldBody:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetBody(v)\n\t\treturn nil\n\tcase order.FieldOrderStatus:\n\t\tv, ok := value.(int8)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetOrderStatus(v)\n\t\treturn nil\n\tcase order.FieldAuthCode:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetAuthCode(v)\n\t\treturn nil\n\tcase order.FieldWxAppid:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetWxAppid(v)\n\t\treturn nil\n\tcase order.FieldSubOpenid:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetSubOpenid(v)\n\t\treturn nil\n\tcase order.FieldJumpURL:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetJumpURL(v)\n\t\treturn nil\n\tcase order.FieldNotifyURL:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetNotifyURL(v)\n\t\treturn nil\n\tcase order.FieldClientIP:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetClientIP(v)\n\t\treturn nil\n\tcase order.FieldAttach:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetAttach(v)\n\t\treturn nil\n\tcase order.FieldOrderExpiration:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetOrderExpiration(v)\n\t\treturn nil\n\tcase order.FieldExtendParams:\n\t\tv, ok := value.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.SetExtendParams(v)\n\t\treturn nil\n\t}\n\treturn fmt.Errorf(\"unknown Order field %s\", name)\n}\n\n// AddedFields returns all numeric fields that were incremented/decremented during\n// this mutation.\nfunc (m *OrderMutation) AddedFields() []string {\n\tvar fields []string\n\tif m.addtotal_amount != nil {\n\t\tfields = append(fields, order.FieldTotalAmount)\n\t}\n\tif m.addorder_status != nil {\n\t\tfields = append(fields, order.FieldOrderStatus)\n\t}\n\treturn fields\n}\n\n// AddedField returns the numeric value that was incremented/decremented on a field\n// with the given name. The second boolean return value indicates that this field\n// was not set, or was not defined in the schema.\nfunc (m *OrderMutation) AddedField(name string) (ent.Value, bool) {\n\tswitch name {\n\tcase order.FieldTotalAmount:\n\t\treturn m.AddedTotalAmount()\n\tcase order.FieldOrderStatus:\n\t\treturn m.AddedOrderStatus()\n\t}\n\treturn nil, false\n}\n\n// AddField adds the value to the field with the given name. It returns an error if\n// the field is not defined in the schema, or if the type mismatched the field\n// type.\nfunc (m *OrderMutation) AddField(name string, value ent.Value) error {\n\tswitch name {\n\tcase order.FieldTotalAmount:\n\t\tv, ok := value.(int64)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.AddTotalAmount(v)\n\t\treturn nil\n\tcase order.FieldOrderStatus:\n\t\tv, ok := value.(int8)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"unexpected type %T for field %s\", value, name)\n\t\t}\n\t\tm.AddOrderStatus(v)\n\t\treturn nil\n\t}\n\treturn fmt.Errorf(\"unknown Order numeric field %s\", name)\n}\n\n// ClearedFields returns all nullable fields that were cleared during this\n// mutation.\nfunc (m *OrderMutation) ClearedFields() []string {\n\treturn nil\n}\n\n// FieldCleared returns a boolean indicating if a field with the given name was\n// cleared in this mutation.\nfunc (m *OrderMutation) FieldCleared(name string) bool {\n\t_, ok := m.clearedFields[name]\n\treturn ok\n}\n\n// ClearField clears the value of the field with the given name. It returns an\n// error if the field is not defined in the schema.\nfunc (m *OrderMutation) ClearField(name string) error {\n\treturn fmt.Errorf(\"unknown Order nullable field %s\", name)\n}\n\n// ResetField resets all changes in the mutation for the field with the given name.\n// It returns an error if the field is not defined in the schema.\nfunc (m *OrderMutation) ResetField(name string) error {\n\tswitch name {\n\tcase order.FieldMerchantID:\n\t\tm.ResetMerchantID()\n\t\treturn nil\n\tcase order.FieldChannel:\n\t\tm.ResetChannel()\n\t\treturn nil\n\tcase order.FieldPayWay:\n\t\tm.ResetPayWay()\n\t\treturn nil\n\tcase order.FieldOutOrderNo:\n\t\tm.ResetOutOrderNo()\n\t\treturn nil\n\tcase order.FieldTotalAmount:\n\t\tm.ResetTotalAmount()\n\t\treturn nil\n\tcase order.FieldBody:\n\t\tm.ResetBody()\n\t\treturn nil\n\tcase order.FieldOrderStatus:\n\t\tm.ResetOrderStatus()\n\t\treturn nil\n\tcase order.FieldAuthCode:\n\t\tm.ResetAuthCode()\n\t\treturn nil\n\tcase order.FieldWxAppid:\n\t\tm.ResetWxAppid()\n\t\treturn nil\n\tcase order.FieldSubOpenid:\n\t\tm.ResetSubOpenid()\n\t\treturn nil\n\tcase order.FieldJumpURL:\n\t\tm.ResetJumpURL()\n\t\treturn nil\n\tcase order.FieldNotifyURL:\n\t\tm.ResetNotifyURL()\n\t\treturn nil\n\tcase order.FieldClientIP:\n\t\tm.ResetClientIP()\n\t\treturn nil\n\tcase order.FieldAttach:\n\t\tm.ResetAttach()\n\t\treturn nil\n\tcase order.FieldOrderExpiration:\n\t\tm.ResetOrderExpiration()\n\t\treturn nil\n\tcase order.FieldExtendParams:\n\t\tm.ResetExtendParams()\n\t\treturn nil\n\t}\n\treturn fmt.Errorf(\"unknown Order field %s\", name)\n}\n\n// AddedEdges returns all edge names that were set/added in this mutation.\nfunc (m *OrderMutation) AddedEdges() []string {\n\tedges := make([]string, 0, 0)\n\treturn edges\n}\n\n// AddedIDs returns all IDs (to other nodes) that were added for the given edge\n// name in this mutation.\nfunc (m *OrderMutation) AddedIDs(name string) []ent.Value {\n\treturn nil\n}\n\n// RemovedEdges returns all edge names that were removed in this mutation.\nfunc (m *OrderMutation) RemovedEdges() []string {\n\tedges := make([]string, 0, 0)\n\treturn edges\n}\n\n// RemovedIDs returns all IDs (to other nodes) that were removed for the edge with\n// the given name in this mutation.\nfunc (m *OrderMutation) RemovedIDs(name string) []ent.Value {\n\treturn nil\n}\n\n// ClearedEdges returns all edge names that were cleared in this mutation.\nfunc (m *OrderMutation) ClearedEdges() []string {\n\tedges := make([]string, 0, 0)\n\treturn edges\n}\n\n// EdgeCleared returns a boolean which indicates if the edge with the given name\n// was cleared in this mutation.\nfunc (m *OrderMutation) EdgeCleared(name string) bool {\n\treturn false\n}\n\n// ClearEdge clears the value of the edge with the given name. It returns an error\n// if that edge is not defined in the schema.\nfunc (m *OrderMutation) ClearEdge(name string) error {\n\treturn fmt.Errorf(\"unknown Order unique edge %s\", name)\n}\n\n// ResetEdge resets all changes to the edge with the given name in this mutation.\n// It returns an error if the edge is not defined in the schema.\nfunc (m *OrderMutation) ResetEdge(name string) error {\n\treturn fmt.Errorf(\"unknown Order edge %s\", name)\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/order/order.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage order\n\nconst (\n\t// Label holds the string label denoting the order type in the database.\n\tLabel = \"order\"\n\t// FieldID holds the string denoting the id field in the database.\n\tFieldID = \"id\"\n\t// FieldMerchantID holds the string denoting the merchant_id field in the database.\n\tFieldMerchantID = \"merchant_id\"\n\t// FieldChannel holds the string denoting the channel field in the database.\n\tFieldChannel = \"channel\"\n\t// FieldPayWay holds the string denoting the pay_way field in the database.\n\tFieldPayWay = \"pay_way\"\n\t// FieldOutOrderNo holds the string denoting the out_order_no field in the database.\n\tFieldOutOrderNo = \"out_order_no\"\n\t// FieldTotalAmount holds the string denoting the total_amount field in the database.\n\tFieldTotalAmount = \"total_amount\"\n\t// FieldBody holds the string denoting the body field in the database.\n\tFieldBody = \"body\"\n\t// FieldOrderStatus holds the string denoting the order_status field in the database.\n\tFieldOrderStatus = \"order_status\"\n\t// FieldAuthCode holds the string denoting the auth_code field in the database.\n\tFieldAuthCode = \"auth_code\"\n\t// FieldWxAppid holds the string denoting the wx_appid field in the database.\n\tFieldWxAppid = \"wx_appid\"\n\t// FieldSubOpenid holds the string denoting the sub_openid field in the database.\n\tFieldSubOpenid = \"sub_openid\"\n\t// FieldJumpURL holds the string denoting the jump_url field in the database.\n\tFieldJumpURL = \"jump_url\"\n\t// FieldNotifyURL holds the string denoting the notify_url field in the database.\n\tFieldNotifyURL = \"notify_url\"\n\t// FieldClientIP holds the string denoting the client_ip field in the database.\n\tFieldClientIP = \"client_ip\"\n\t// FieldAttach holds the string denoting the attach field in the database.\n\tFieldAttach = \"attach\"\n\t// FieldOrderExpiration holds the string denoting the order_expiration field in the database.\n\tFieldOrderExpiration = \"order_expiration\"\n\t// FieldExtendParams holds the string denoting the extend_params field in the database.\n\tFieldExtendParams = \"extend_params\"\n\t// Table holds the table name of the order in the database.\n\tTable = \"orders\"\n)\n\n// Columns holds all SQL columns for order fields.\nvar Columns = []string{\n\tFieldID,\n\tFieldMerchantID,\n\tFieldChannel,\n\tFieldPayWay,\n\tFieldOutOrderNo,\n\tFieldTotalAmount,\n\tFieldBody,\n\tFieldOrderStatus,\n\tFieldAuthCode,\n\tFieldWxAppid,\n\tFieldSubOpenid,\n\tFieldJumpURL,\n\tFieldNotifyURL,\n\tFieldClientIP,\n\tFieldAttach,\n\tFieldOrderExpiration,\n\tFieldExtendParams,\n}\n\n// ValidColumn reports if the column name is valid (part of the table columns).\nfunc ValidColumn(column string) bool {\n\tfor i := range Columns {\n\t\tif column == Columns[i] {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/order/where.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage order\n\nimport (\n\t\"entgo.io/ent/dialect/sql\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/predicate\"\n)\n\n// ID filters vertices based on their ID field.\nfunc ID(id int) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldID), id))\n\t})\n}\n\n// IDEQ applies the EQ predicate on the ID field.\nfunc IDEQ(id int) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldID), id))\n\t})\n}\n\n// IDNEQ applies the NEQ predicate on the ID field.\nfunc IDNEQ(id int) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldID), id))\n\t})\n}\n\n// IDIn applies the In predicate on the ID field.\nfunc IDIn(ids ...int) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\tv := make([]any, len(ids))\n\t\tfor i := range v {\n\t\t\tv[i] = ids[i]\n\t\t}\n\t\ts.Where(sql.In(s.C(FieldID), v...))\n\t})\n}\n\n// IDNotIn applies the NotIn predicate on the ID field.\nfunc IDNotIn(ids ...int) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\tv := make([]any, len(ids))\n\t\tfor i := range v {\n\t\t\tv[i] = ids[i]\n\t\t}\n\t\ts.Where(sql.NotIn(s.C(FieldID), v...))\n\t})\n}\n\n// IDGT applies the GT predicate on the ID field.\nfunc IDGT(id int) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldID), id))\n\t})\n}\n\n// IDGTE applies the GTE predicate on the ID field.\nfunc IDGTE(id int) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldID), id))\n\t})\n}\n\n// IDLT applies the LT predicate on the ID field.\nfunc IDLT(id int) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldID), id))\n\t})\n}\n\n// IDLTE applies the LTE predicate on the ID field.\nfunc IDLTE(id int) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldID), id))\n\t})\n}\n\n// MerchantID applies equality check predicate on the \"merchant_id\" field. It's identical to MerchantIDEQ.\nfunc MerchantID(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldMerchantID), v))\n\t})\n}\n\n// Channel applies equality check predicate on the \"channel\" field. It's identical to ChannelEQ.\nfunc Channel(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldChannel), v))\n\t})\n}\n\n// PayWay applies equality check predicate on the \"pay_way\" field. It's identical to PayWayEQ.\nfunc PayWay(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldPayWay), v))\n\t})\n}\n\n// OutOrderNo applies equality check predicate on the \"out_order_no\" field. It's identical to OutOrderNoEQ.\nfunc OutOrderNo(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// TotalAmount applies equality check predicate on the \"total_amount\" field. It's identical to TotalAmountEQ.\nfunc TotalAmount(v uint64) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldTotalAmount), v))\n\t})\n}\n\n// Body applies equality check predicate on the \"body\" field. It's identical to BodyEQ.\nfunc Body(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldBody), v))\n\t})\n}\n\n// OrderStatus applies equality check predicate on the \"order_status\" field. It's identical to OrderStatusEQ.\nfunc OrderStatus(v int8) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldOrderStatus), v))\n\t})\n}\n\n// AuthCode applies equality check predicate on the \"auth_code\" field. It's identical to AuthCodeEQ.\nfunc AuthCode(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldAuthCode), v))\n\t})\n}\n\n// WxAppid applies equality check predicate on the \"wx_appid\" field. It's identical to WxAppidEQ.\nfunc WxAppid(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldWxAppid), v))\n\t})\n}\n\n// SubOpenid applies equality check predicate on the \"sub_openid\" field. It's identical to SubOpenidEQ.\nfunc SubOpenid(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// JumpURL applies equality check predicate on the \"jump_url\" field. It's identical to JumpURLEQ.\nfunc JumpURL(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldJumpURL), v))\n\t})\n}\n\n// NotifyURL applies equality check predicate on the \"notify_url\" field. It's identical to NotifyURLEQ.\nfunc NotifyURL(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// ClientIP applies equality check predicate on the \"client_ip\" field. It's identical to ClientIPEQ.\nfunc ClientIP(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldClientIP), v))\n\t})\n}\n\n// Attach applies equality check predicate on the \"attach\" field. It's identical to AttachEQ.\nfunc Attach(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldAttach), v))\n\t})\n}\n\n// OrderExpiration applies equality check predicate on the \"order_expiration\" field. It's identical to OrderExpirationEQ.\nfunc OrderExpiration(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// ExtendParams applies equality check predicate on the \"extend_params\" field. It's identical to ExtendParamsEQ.\nfunc ExtendParams(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldExtendParams), v))\n\t})\n}\n\n// MerchantIDEQ applies the EQ predicate on the \"merchant_id\" field.\nfunc MerchantIDEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDNEQ applies the NEQ predicate on the \"merchant_id\" field.\nfunc MerchantIDNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDIn applies the In predicate on the \"merchant_id\" field.\nfunc MerchantIDIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldMerchantID), v...))\n\t})\n}\n\n// MerchantIDNotIn applies the NotIn predicate on the \"merchant_id\" field.\nfunc MerchantIDNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldMerchantID), v...))\n\t})\n}\n\n// MerchantIDGT applies the GT predicate on the \"merchant_id\" field.\nfunc MerchantIDGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDGTE applies the GTE predicate on the \"merchant_id\" field.\nfunc MerchantIDGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDLT applies the LT predicate on the \"merchant_id\" field.\nfunc MerchantIDLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDLTE applies the LTE predicate on the \"merchant_id\" field.\nfunc MerchantIDLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDContains applies the Contains predicate on the \"merchant_id\" field.\nfunc MerchantIDContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDHasPrefix applies the HasPrefix predicate on the \"merchant_id\" field.\nfunc MerchantIDHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDHasSuffix applies the HasSuffix predicate on the \"merchant_id\" field.\nfunc MerchantIDHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDEqualFold applies the EqualFold predicate on the \"merchant_id\" field.\nfunc MerchantIDEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldMerchantID), v))\n\t})\n}\n\n// MerchantIDContainsFold applies the ContainsFold predicate on the \"merchant_id\" field.\nfunc MerchantIDContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldMerchantID), v))\n\t})\n}\n\n// ChannelEQ applies the EQ predicate on the \"channel\" field.\nfunc ChannelEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelNEQ applies the NEQ predicate on the \"channel\" field.\nfunc ChannelNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelIn applies the In predicate on the \"channel\" field.\nfunc ChannelIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldChannel), v...))\n\t})\n}\n\n// ChannelNotIn applies the NotIn predicate on the \"channel\" field.\nfunc ChannelNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldChannel), v...))\n\t})\n}\n\n// ChannelGT applies the GT predicate on the \"channel\" field.\nfunc ChannelGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelGTE applies the GTE predicate on the \"channel\" field.\nfunc ChannelGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelLT applies the LT predicate on the \"channel\" field.\nfunc ChannelLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelLTE applies the LTE predicate on the \"channel\" field.\nfunc ChannelLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelContains applies the Contains predicate on the \"channel\" field.\nfunc ChannelContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelHasPrefix applies the HasPrefix predicate on the \"channel\" field.\nfunc ChannelHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelHasSuffix applies the HasSuffix predicate on the \"channel\" field.\nfunc ChannelHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelEqualFold applies the EqualFold predicate on the \"channel\" field.\nfunc ChannelEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldChannel), v))\n\t})\n}\n\n// ChannelContainsFold applies the ContainsFold predicate on the \"channel\" field.\nfunc ChannelContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldChannel), v))\n\t})\n}\n\n// PayWayEQ applies the EQ predicate on the \"pay_way\" field.\nfunc PayWayEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayNEQ applies the NEQ predicate on the \"pay_way\" field.\nfunc PayWayNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayIn applies the In predicate on the \"pay_way\" field.\nfunc PayWayIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldPayWay), v...))\n\t})\n}\n\n// PayWayNotIn applies the NotIn predicate on the \"pay_way\" field.\nfunc PayWayNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldPayWay), v...))\n\t})\n}\n\n// PayWayGT applies the GT predicate on the \"pay_way\" field.\nfunc PayWayGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayGTE applies the GTE predicate on the \"pay_way\" field.\nfunc PayWayGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayLT applies the LT predicate on the \"pay_way\" field.\nfunc PayWayLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayLTE applies the LTE predicate on the \"pay_way\" field.\nfunc PayWayLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayContains applies the Contains predicate on the \"pay_way\" field.\nfunc PayWayContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayHasPrefix applies the HasPrefix predicate on the \"pay_way\" field.\nfunc PayWayHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayHasSuffix applies the HasSuffix predicate on the \"pay_way\" field.\nfunc PayWayHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayEqualFold applies the EqualFold predicate on the \"pay_way\" field.\nfunc PayWayEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldPayWay), v))\n\t})\n}\n\n// PayWayContainsFold applies the ContainsFold predicate on the \"pay_way\" field.\nfunc PayWayContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldPayWay), v))\n\t})\n}\n\n// OutOrderNoEQ applies the EQ predicate on the \"out_order_no\" field.\nfunc OutOrderNoEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoNEQ applies the NEQ predicate on the \"out_order_no\" field.\nfunc OutOrderNoNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoIn applies the In predicate on the \"out_order_no\" field.\nfunc OutOrderNoIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldOutOrderNo), v...))\n\t})\n}\n\n// OutOrderNoNotIn applies the NotIn predicate on the \"out_order_no\" field.\nfunc OutOrderNoNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldOutOrderNo), v...))\n\t})\n}\n\n// OutOrderNoGT applies the GT predicate on the \"out_order_no\" field.\nfunc OutOrderNoGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoGTE applies the GTE predicate on the \"out_order_no\" field.\nfunc OutOrderNoGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoLT applies the LT predicate on the \"out_order_no\" field.\nfunc OutOrderNoLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoLTE applies the LTE predicate on the \"out_order_no\" field.\nfunc OutOrderNoLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoContains applies the Contains predicate on the \"out_order_no\" field.\nfunc OutOrderNoContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoHasPrefix applies the HasPrefix predicate on the \"out_order_no\" field.\nfunc OutOrderNoHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoHasSuffix applies the HasSuffix predicate on the \"out_order_no\" field.\nfunc OutOrderNoHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoEqualFold applies the EqualFold predicate on the \"out_order_no\" field.\nfunc OutOrderNoEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// OutOrderNoContainsFold applies the ContainsFold predicate on the \"out_order_no\" field.\nfunc OutOrderNoContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldOutOrderNo), v))\n\t})\n}\n\n// TotalAmountEQ applies the EQ predicate on the \"total_amount\" field.\nfunc TotalAmountEQ(v uint64) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldTotalAmount), v))\n\t})\n}\n\n// TotalAmountNEQ applies the NEQ predicate on the \"total_amount\" field.\nfunc TotalAmountNEQ(v uint64) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldTotalAmount), v))\n\t})\n}\n\n// TotalAmountIn applies the In predicate on the \"total_amount\" field.\nfunc TotalAmountIn(vs ...uint64) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldTotalAmount), v...))\n\t})\n}\n\n// TotalAmountNotIn applies the NotIn predicate on the \"total_amount\" field.\nfunc TotalAmountNotIn(vs ...uint64) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldTotalAmount), v...))\n\t})\n}\n\n// TotalAmountGT applies the GT predicate on the \"total_amount\" field.\nfunc TotalAmountGT(v uint64) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldTotalAmount), v))\n\t})\n}\n\n// TotalAmountGTE applies the GTE predicate on the \"total_amount\" field.\nfunc TotalAmountGTE(v uint64) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldTotalAmount), v))\n\t})\n}\n\n// TotalAmountLT applies the LT predicate on the \"total_amount\" field.\nfunc TotalAmountLT(v uint64) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldTotalAmount), v))\n\t})\n}\n\n// TotalAmountLTE applies the LTE predicate on the \"total_amount\" field.\nfunc TotalAmountLTE(v uint64) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldTotalAmount), v))\n\t})\n}\n\n// BodyEQ applies the EQ predicate on the \"body\" field.\nfunc BodyEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldBody), v))\n\t})\n}\n\n// BodyNEQ applies the NEQ predicate on the \"body\" field.\nfunc BodyNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldBody), v))\n\t})\n}\n\n// BodyIn applies the In predicate on the \"body\" field.\nfunc BodyIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldBody), v...))\n\t})\n}\n\n// BodyNotIn applies the NotIn predicate on the \"body\" field.\nfunc BodyNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldBody), v...))\n\t})\n}\n\n// BodyGT applies the GT predicate on the \"body\" field.\nfunc BodyGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldBody), v))\n\t})\n}\n\n// BodyGTE applies the GTE predicate on the \"body\" field.\nfunc BodyGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldBody), v))\n\t})\n}\n\n// BodyLT applies the LT predicate on the \"body\" field.\nfunc BodyLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldBody), v))\n\t})\n}\n\n// BodyLTE applies the LTE predicate on the \"body\" field.\nfunc BodyLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldBody), v))\n\t})\n}\n\n// BodyContains applies the Contains predicate on the \"body\" field.\nfunc BodyContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldBody), v))\n\t})\n}\n\n// BodyHasPrefix applies the HasPrefix predicate on the \"body\" field.\nfunc BodyHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldBody), v))\n\t})\n}\n\n// BodyHasSuffix applies the HasSuffix predicate on the \"body\" field.\nfunc BodyHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldBody), v))\n\t})\n}\n\n// BodyEqualFold applies the EqualFold predicate on the \"body\" field.\nfunc BodyEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldBody), v))\n\t})\n}\n\n// BodyContainsFold applies the ContainsFold predicate on the \"body\" field.\nfunc BodyContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldBody), v))\n\t})\n}\n\n// OrderStatusEQ applies the EQ predicate on the \"order_status\" field.\nfunc OrderStatusEQ(v int8) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldOrderStatus), v))\n\t})\n}\n\n// OrderStatusNEQ applies the NEQ predicate on the \"order_status\" field.\nfunc OrderStatusNEQ(v int8) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldOrderStatus), v))\n\t})\n}\n\n// OrderStatusIn applies the In predicate on the \"order_status\" field.\nfunc OrderStatusIn(vs ...int8) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldOrderStatus), v...))\n\t})\n}\n\n// OrderStatusNotIn applies the NotIn predicate on the \"order_status\" field.\nfunc OrderStatusNotIn(vs ...int8) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldOrderStatus), v...))\n\t})\n}\n\n// OrderStatusGT applies the GT predicate on the \"order_status\" field.\nfunc OrderStatusGT(v int8) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldOrderStatus), v))\n\t})\n}\n\n// OrderStatusGTE applies the GTE predicate on the \"order_status\" field.\nfunc OrderStatusGTE(v int8) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldOrderStatus), v))\n\t})\n}\n\n// OrderStatusLT applies the LT predicate on the \"order_status\" field.\nfunc OrderStatusLT(v int8) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldOrderStatus), v))\n\t})\n}\n\n// OrderStatusLTE applies the LTE predicate on the \"order_status\" field.\nfunc OrderStatusLTE(v int8) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldOrderStatus), v))\n\t})\n}\n\n// AuthCodeEQ applies the EQ predicate on the \"auth_code\" field.\nfunc AuthCodeEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeNEQ applies the NEQ predicate on the \"auth_code\" field.\nfunc AuthCodeNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeIn applies the In predicate on the \"auth_code\" field.\nfunc AuthCodeIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldAuthCode), v...))\n\t})\n}\n\n// AuthCodeNotIn applies the NotIn predicate on the \"auth_code\" field.\nfunc AuthCodeNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldAuthCode), v...))\n\t})\n}\n\n// AuthCodeGT applies the GT predicate on the \"auth_code\" field.\nfunc AuthCodeGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeGTE applies the GTE predicate on the \"auth_code\" field.\nfunc AuthCodeGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeLT applies the LT predicate on the \"auth_code\" field.\nfunc AuthCodeLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeLTE applies the LTE predicate on the \"auth_code\" field.\nfunc AuthCodeLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeContains applies the Contains predicate on the \"auth_code\" field.\nfunc AuthCodeContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeHasPrefix applies the HasPrefix predicate on the \"auth_code\" field.\nfunc AuthCodeHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeHasSuffix applies the HasSuffix predicate on the \"auth_code\" field.\nfunc AuthCodeHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeEqualFold applies the EqualFold predicate on the \"auth_code\" field.\nfunc AuthCodeEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldAuthCode), v))\n\t})\n}\n\n// AuthCodeContainsFold applies the ContainsFold predicate on the \"auth_code\" field.\nfunc AuthCodeContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldAuthCode), v))\n\t})\n}\n\n// WxAppidEQ applies the EQ predicate on the \"wx_appid\" field.\nfunc WxAppidEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidNEQ applies the NEQ predicate on the \"wx_appid\" field.\nfunc WxAppidNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidIn applies the In predicate on the \"wx_appid\" field.\nfunc WxAppidIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldWxAppid), v...))\n\t})\n}\n\n// WxAppidNotIn applies the NotIn predicate on the \"wx_appid\" field.\nfunc WxAppidNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldWxAppid), v...))\n\t})\n}\n\n// WxAppidGT applies the GT predicate on the \"wx_appid\" field.\nfunc WxAppidGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidGTE applies the GTE predicate on the \"wx_appid\" field.\nfunc WxAppidGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidLT applies the LT predicate on the \"wx_appid\" field.\nfunc WxAppidLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidLTE applies the LTE predicate on the \"wx_appid\" field.\nfunc WxAppidLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidContains applies the Contains predicate on the \"wx_appid\" field.\nfunc WxAppidContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidHasPrefix applies the HasPrefix predicate on the \"wx_appid\" field.\nfunc WxAppidHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidHasSuffix applies the HasSuffix predicate on the \"wx_appid\" field.\nfunc WxAppidHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidEqualFold applies the EqualFold predicate on the \"wx_appid\" field.\nfunc WxAppidEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldWxAppid), v))\n\t})\n}\n\n// WxAppidContainsFold applies the ContainsFold predicate on the \"wx_appid\" field.\nfunc WxAppidContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldWxAppid), v))\n\t})\n}\n\n// SubOpenidEQ applies the EQ predicate on the \"sub_openid\" field.\nfunc SubOpenidEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidNEQ applies the NEQ predicate on the \"sub_openid\" field.\nfunc SubOpenidNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidIn applies the In predicate on the \"sub_openid\" field.\nfunc SubOpenidIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldSubOpenid), v...))\n\t})\n}\n\n// SubOpenidNotIn applies the NotIn predicate on the \"sub_openid\" field.\nfunc SubOpenidNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldSubOpenid), v...))\n\t})\n}\n\n// SubOpenidGT applies the GT predicate on the \"sub_openid\" field.\nfunc SubOpenidGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidGTE applies the GTE predicate on the \"sub_openid\" field.\nfunc SubOpenidGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidLT applies the LT predicate on the \"sub_openid\" field.\nfunc SubOpenidLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidLTE applies the LTE predicate on the \"sub_openid\" field.\nfunc SubOpenidLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidContains applies the Contains predicate on the \"sub_openid\" field.\nfunc SubOpenidContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidHasPrefix applies the HasPrefix predicate on the \"sub_openid\" field.\nfunc SubOpenidHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidHasSuffix applies the HasSuffix predicate on the \"sub_openid\" field.\nfunc SubOpenidHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidEqualFold applies the EqualFold predicate on the \"sub_openid\" field.\nfunc SubOpenidEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// SubOpenidContainsFold applies the ContainsFold predicate on the \"sub_openid\" field.\nfunc SubOpenidContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldSubOpenid), v))\n\t})\n}\n\n// JumpURLEQ applies the EQ predicate on the \"jump_url\" field.\nfunc JumpURLEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLNEQ applies the NEQ predicate on the \"jump_url\" field.\nfunc JumpURLNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLIn applies the In predicate on the \"jump_url\" field.\nfunc JumpURLIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldJumpURL), v...))\n\t})\n}\n\n// JumpURLNotIn applies the NotIn predicate on the \"jump_url\" field.\nfunc JumpURLNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldJumpURL), v...))\n\t})\n}\n\n// JumpURLGT applies the GT predicate on the \"jump_url\" field.\nfunc JumpURLGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLGTE applies the GTE predicate on the \"jump_url\" field.\nfunc JumpURLGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLLT applies the LT predicate on the \"jump_url\" field.\nfunc JumpURLLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLLTE applies the LTE predicate on the \"jump_url\" field.\nfunc JumpURLLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLContains applies the Contains predicate on the \"jump_url\" field.\nfunc JumpURLContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLHasPrefix applies the HasPrefix predicate on the \"jump_url\" field.\nfunc JumpURLHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLHasSuffix applies the HasSuffix predicate on the \"jump_url\" field.\nfunc JumpURLHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLEqualFold applies the EqualFold predicate on the \"jump_url\" field.\nfunc JumpURLEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldJumpURL), v))\n\t})\n}\n\n// JumpURLContainsFold applies the ContainsFold predicate on the \"jump_url\" field.\nfunc JumpURLContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldJumpURL), v))\n\t})\n}\n\n// NotifyURLEQ applies the EQ predicate on the \"notify_url\" field.\nfunc NotifyURLEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLNEQ applies the NEQ predicate on the \"notify_url\" field.\nfunc NotifyURLNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLIn applies the In predicate on the \"notify_url\" field.\nfunc NotifyURLIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldNotifyURL), v...))\n\t})\n}\n\n// NotifyURLNotIn applies the NotIn predicate on the \"notify_url\" field.\nfunc NotifyURLNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldNotifyURL), v...))\n\t})\n}\n\n// NotifyURLGT applies the GT predicate on the \"notify_url\" field.\nfunc NotifyURLGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLGTE applies the GTE predicate on the \"notify_url\" field.\nfunc NotifyURLGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLLT applies the LT predicate on the \"notify_url\" field.\nfunc NotifyURLLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLLTE applies the LTE predicate on the \"notify_url\" field.\nfunc NotifyURLLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLContains applies the Contains predicate on the \"notify_url\" field.\nfunc NotifyURLContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLHasPrefix applies the HasPrefix predicate on the \"notify_url\" field.\nfunc NotifyURLHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLHasSuffix applies the HasSuffix predicate on the \"notify_url\" field.\nfunc NotifyURLHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLEqualFold applies the EqualFold predicate on the \"notify_url\" field.\nfunc NotifyURLEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// NotifyURLContainsFold applies the ContainsFold predicate on the \"notify_url\" field.\nfunc NotifyURLContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldNotifyURL), v))\n\t})\n}\n\n// ClientIPEQ applies the EQ predicate on the \"client_ip\" field.\nfunc ClientIPEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPNEQ applies the NEQ predicate on the \"client_ip\" field.\nfunc ClientIPNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPIn applies the In predicate on the \"client_ip\" field.\nfunc ClientIPIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldClientIP), v...))\n\t})\n}\n\n// ClientIPNotIn applies the NotIn predicate on the \"client_ip\" field.\nfunc ClientIPNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldClientIP), v...))\n\t})\n}\n\n// ClientIPGT applies the GT predicate on the \"client_ip\" field.\nfunc ClientIPGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPGTE applies the GTE predicate on the \"client_ip\" field.\nfunc ClientIPGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPLT applies the LT predicate on the \"client_ip\" field.\nfunc ClientIPLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPLTE applies the LTE predicate on the \"client_ip\" field.\nfunc ClientIPLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPContains applies the Contains predicate on the \"client_ip\" field.\nfunc ClientIPContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPHasPrefix applies the HasPrefix predicate on the \"client_ip\" field.\nfunc ClientIPHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPHasSuffix applies the HasSuffix predicate on the \"client_ip\" field.\nfunc ClientIPHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPEqualFold applies the EqualFold predicate on the \"client_ip\" field.\nfunc ClientIPEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldClientIP), v))\n\t})\n}\n\n// ClientIPContainsFold applies the ContainsFold predicate on the \"client_ip\" field.\nfunc ClientIPContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldClientIP), v))\n\t})\n}\n\n// AttachEQ applies the EQ predicate on the \"attach\" field.\nfunc AttachEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachNEQ applies the NEQ predicate on the \"attach\" field.\nfunc AttachNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachIn applies the In predicate on the \"attach\" field.\nfunc AttachIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldAttach), v...))\n\t})\n}\n\n// AttachNotIn applies the NotIn predicate on the \"attach\" field.\nfunc AttachNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldAttach), v...))\n\t})\n}\n\n// AttachGT applies the GT predicate on the \"attach\" field.\nfunc AttachGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachGTE applies the GTE predicate on the \"attach\" field.\nfunc AttachGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachLT applies the LT predicate on the \"attach\" field.\nfunc AttachLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachLTE applies the LTE predicate on the \"attach\" field.\nfunc AttachLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachContains applies the Contains predicate on the \"attach\" field.\nfunc AttachContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachHasPrefix applies the HasPrefix predicate on the \"attach\" field.\nfunc AttachHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachHasSuffix applies the HasSuffix predicate on the \"attach\" field.\nfunc AttachHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachEqualFold applies the EqualFold predicate on the \"attach\" field.\nfunc AttachEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldAttach), v))\n\t})\n}\n\n// AttachContainsFold applies the ContainsFold predicate on the \"attach\" field.\nfunc AttachContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldAttach), v))\n\t})\n}\n\n// OrderExpirationEQ applies the EQ predicate on the \"order_expiration\" field.\nfunc OrderExpirationEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationNEQ applies the NEQ predicate on the \"order_expiration\" field.\nfunc OrderExpirationNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationIn applies the In predicate on the \"order_expiration\" field.\nfunc OrderExpirationIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldOrderExpiration), v...))\n\t})\n}\n\n// OrderExpirationNotIn applies the NotIn predicate on the \"order_expiration\" field.\nfunc OrderExpirationNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldOrderExpiration), v...))\n\t})\n}\n\n// OrderExpirationGT applies the GT predicate on the \"order_expiration\" field.\nfunc OrderExpirationGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationGTE applies the GTE predicate on the \"order_expiration\" field.\nfunc OrderExpirationGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationLT applies the LT predicate on the \"order_expiration\" field.\nfunc OrderExpirationLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationLTE applies the LTE predicate on the \"order_expiration\" field.\nfunc OrderExpirationLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationContains applies the Contains predicate on the \"order_expiration\" field.\nfunc OrderExpirationContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationHasPrefix applies the HasPrefix predicate on the \"order_expiration\" field.\nfunc OrderExpirationHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationHasSuffix applies the HasSuffix predicate on the \"order_expiration\" field.\nfunc OrderExpirationHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationEqualFold applies the EqualFold predicate on the \"order_expiration\" field.\nfunc OrderExpirationEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// OrderExpirationContainsFold applies the ContainsFold predicate on the \"order_expiration\" field.\nfunc OrderExpirationContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldOrderExpiration), v))\n\t})\n}\n\n// ExtendParamsEQ applies the EQ predicate on the \"extend_params\" field.\nfunc ExtendParamsEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EQ(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsNEQ applies the NEQ predicate on the \"extend_params\" field.\nfunc ExtendParamsNEQ(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NEQ(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsIn applies the In predicate on the \"extend_params\" field.\nfunc ExtendParamsIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.In(s.C(FieldExtendParams), v...))\n\t})\n}\n\n// ExtendParamsNotIn applies the NotIn predicate on the \"extend_params\" field.\nfunc ExtendParamsNotIn(vs ...string) predicate.Order {\n\tv := make([]any, len(vs))\n\tfor i := range v {\n\t\tv[i] = vs[i]\n\t}\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.NotIn(s.C(FieldExtendParams), v...))\n\t})\n}\n\n// ExtendParamsGT applies the GT predicate on the \"extend_params\" field.\nfunc ExtendParamsGT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GT(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsGTE applies the GTE predicate on the \"extend_params\" field.\nfunc ExtendParamsGTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.GTE(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsLT applies the LT predicate on the \"extend_params\" field.\nfunc ExtendParamsLT(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LT(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsLTE applies the LTE predicate on the \"extend_params\" field.\nfunc ExtendParamsLTE(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.LTE(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsContains applies the Contains predicate on the \"extend_params\" field.\nfunc ExtendParamsContains(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.Contains(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsHasPrefix applies the HasPrefix predicate on the \"extend_params\" field.\nfunc ExtendParamsHasPrefix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasPrefix(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsHasSuffix applies the HasSuffix predicate on the \"extend_params\" field.\nfunc ExtendParamsHasSuffix(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.HasSuffix(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsEqualFold applies the EqualFold predicate on the \"extend_params\" field.\nfunc ExtendParamsEqualFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.EqualFold(s.C(FieldExtendParams), v))\n\t})\n}\n\n// ExtendParamsContainsFold applies the ContainsFold predicate on the \"extend_params\" field.\nfunc ExtendParamsContainsFold(v string) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts.Where(sql.ContainsFold(s.C(FieldExtendParams), v))\n\t})\n}\n\n// And groups predicates with the AND operator between them.\nfunc And(predicates ...predicate.Order) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts1 := s.Clone().SetP(nil)\n\t\tfor _, p := range predicates {\n\t\t\tp(s1)\n\t\t}\n\t\ts.Where(s1.P())\n\t})\n}\n\n// Or groups predicates with the OR operator between them.\nfunc Or(predicates ...predicate.Order) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\ts1 := s.Clone().SetP(nil)\n\t\tfor i, p := range predicates {\n\t\t\tif i > 0 {\n\t\t\t\ts1.Or()\n\t\t\t}\n\t\t\tp(s1)\n\t\t}\n\t\ts.Where(s1.P())\n\t})\n}\n\n// Not applies the not operator on the given predicate.\nfunc Not(p predicate.Order) predicate.Order {\n\treturn predicate.Order(func(s *sql.Selector) {\n\t\tp(s.Not())\n\t})\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/order.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"entgo.io/ent/dialect/sql\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/order\"\n)\n\n// Order is the model entity for the Order schema.\ntype Order struct {\n\tconfig `json:\"-\"`\n\t// ID of the ent.\n\tID int `json:\"id,omitempty\"`\n\t// MerchantID holds the value of the \"merchant_id\" field.\n\tMerchantID string `json:\"merchant_id,omitempty\"`\n\t// Channel holds the value of the \"channel\" field.\n\tChannel string `json:\"channel,omitempty\"`\n\t// PayWay holds the value of the \"pay_way\" field.\n\tPayWay string `json:\"pay_way,omitempty\"`\n\t// OutOrderNo holds the value of the \"out_order_no\" field.\n\tOutOrderNo string `json:\"out_order_no,omitempty\"`\n\t// TotalAmount holds the value of the \"total_amount\" field.\n\tTotalAmount uint64 `json:\"total_amount,omitempty\"`\n\t// Body holds the value of the \"body\" field.\n\tBody string `json:\"body,omitempty\"`\n\t// OrderStatus holds the value of the \"order_status\" field.\n\tOrderStatus int8 `json:\"order_status,omitempty\"`\n\t// AuthCode holds the value of the \"auth_code\" field.\n\tAuthCode string `json:\"auth_code,omitempty\"`\n\t// WxAppid holds the value of the \"wx_appid\" field.\n\tWxAppid string `json:\"wx_appid,omitempty\"`\n\t// SubOpenid holds the value of the \"sub_openid\" field.\n\tSubOpenid string `json:\"sub_openid,omitempty\"`\n\t// JumpURL holds the value of the \"jump_url\" field.\n\tJumpURL string `json:\"jump_url,omitempty\"`\n\t// NotifyURL holds the value of the \"notify_url\" field.\n\tNotifyURL string `json:\"notify_url,omitempty\"`\n\t// ClientIP holds the value of the \"client_ip\" field.\n\tClientIP string `json:\"client_ip,omitempty\"`\n\t// Attach holds the value of the \"attach\" field.\n\tAttach string `json:\"attach,omitempty\"`\n\t// OrderExpiration holds the value of the \"order_expiration\" field.\n\tOrderExpiration string `json:\"order_expiration,omitempty\"`\n\t// ExtendParams holds the value of the \"extend_params\" field.\n\tExtendParams string `json:\"extend_params,omitempty\"`\n}\n\n// scanValues returns the types for scanning values from sql.Rows.\nfunc (*Order) scanValues(columns []string) ([]any, error) {\n\tvalues := make([]any, len(columns))\n\tfor i := range columns {\n\t\tswitch columns[i] {\n\t\tcase order.FieldID, order.FieldTotalAmount, order.FieldOrderStatus:\n\t\t\tvalues[i] = new(sql.NullInt64)\n\t\tcase order.FieldMerchantID, order.FieldChannel, order.FieldPayWay, order.FieldOutOrderNo, order.FieldBody, order.FieldAuthCode, order.FieldWxAppid, order.FieldSubOpenid, order.FieldJumpURL, order.FieldNotifyURL, order.FieldClientIP, order.FieldAttach, order.FieldOrderExpiration, order.FieldExtendParams:\n\t\t\tvalues[i] = new(sql.NullString)\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"unexpected column %q for type Order\", columns[i])\n\t\t}\n\t}\n\treturn values, nil\n}\n\n// assignValues assigns the values that were returned from sql.Rows (after scanning)\n// to the Order fields.\nfunc (o *Order) assignValues(columns []string, values []any) error {\n\tif m, n := len(values), len(columns); m < n {\n\t\treturn fmt.Errorf(\"mismatch number of scan values: %d != %d\", m, n)\n\t}\n\tfor i := range columns {\n\t\tswitch columns[i] {\n\t\tcase order.FieldID:\n\t\t\tvalue, ok := values[i].(*sql.NullInt64)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field id\", value)\n\t\t\t}\n\t\t\to.ID = int(value.Int64)\n\t\tcase order.FieldMerchantID:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field merchant_id\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.MerchantID = value.String\n\t\t\t}\n\t\tcase order.FieldChannel:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field channel\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.Channel = value.String\n\t\t\t}\n\t\tcase order.FieldPayWay:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field pay_way\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.PayWay = value.String\n\t\t\t}\n\t\tcase order.FieldOutOrderNo:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field out_order_no\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.OutOrderNo = value.String\n\t\t\t}\n\t\tcase order.FieldTotalAmount:\n\t\t\tif value, ok := values[i].(*sql.NullInt64); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field total_amount\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.TotalAmount = uint64(value.Int64)\n\t\t\t}\n\t\tcase order.FieldBody:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field body\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.Body = value.String\n\t\t\t}\n\t\tcase order.FieldOrderStatus:\n\t\t\tif value, ok := values[i].(*sql.NullInt64); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field order_status\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.OrderStatus = int8(value.Int64)\n\t\t\t}\n\t\tcase order.FieldAuthCode:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field auth_code\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.AuthCode = value.String\n\t\t\t}\n\t\tcase order.FieldWxAppid:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field wx_appid\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.WxAppid = value.String\n\t\t\t}\n\t\tcase order.FieldSubOpenid:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field sub_openid\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.SubOpenid = value.String\n\t\t\t}\n\t\tcase order.FieldJumpURL:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field jump_url\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.JumpURL = value.String\n\t\t\t}\n\t\tcase order.FieldNotifyURL:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field notify_url\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.NotifyURL = value.String\n\t\t\t}\n\t\tcase order.FieldClientIP:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field client_ip\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.ClientIP = value.String\n\t\t\t}\n\t\tcase order.FieldAttach:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field attach\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.Attach = value.String\n\t\t\t}\n\t\tcase order.FieldOrderExpiration:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field order_expiration\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.OrderExpiration = value.String\n\t\t\t}\n\t\tcase order.FieldExtendParams:\n\t\t\tif value, ok := values[i].(*sql.NullString); !ok {\n\t\t\t\treturn fmt.Errorf(\"unexpected type %T for field extend_params\", values[i])\n\t\t\t} else if value.Valid {\n\t\t\t\to.ExtendParams = value.String\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// Update returns a builder for updating this Order.\n// Note that you need to call Order.Unwrap() before calling this method if this Order\n// was returned from a transaction, and the transaction was committed or rolled back.\nfunc (o *Order) Update() *OrderUpdateOne {\n\treturn (&OrderClient{config: o.config}).UpdateOne(o)\n}\n\n// Unwrap unwraps the Order entity that was returned from a transaction after it was closed,\n// so that all future queries will be executed through the driver which created the transaction.\nfunc (o *Order) Unwrap() *Order {\n\t_tx, ok := o.config.driver.(*txDriver)\n\tif !ok {\n\t\tpanic(\"ent: Order is not a transactional entity\")\n\t}\n\to.config.driver = _tx.drv\n\treturn o\n}\n\n// String implements the fmt.Stringer.\nfunc (o *Order) String() string {\n\tvar builder strings.Builder\n\tbuilder.WriteString(\"Order(\")\n\tbuilder.WriteString(fmt.Sprintf(\"id=%v, \", o.ID))\n\tbuilder.WriteString(\"merchant_id=\")\n\tbuilder.WriteString(o.MerchantID)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"channel=\")\n\tbuilder.WriteString(o.Channel)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"pay_way=\")\n\tbuilder.WriteString(o.PayWay)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"out_order_no=\")\n\tbuilder.WriteString(o.OutOrderNo)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"total_amount=\")\n\tbuilder.WriteString(fmt.Sprintf(\"%v\", o.TotalAmount))\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"body=\")\n\tbuilder.WriteString(o.Body)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"order_status=\")\n\tbuilder.WriteString(fmt.Sprintf(\"%v\", o.OrderStatus))\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"auth_code=\")\n\tbuilder.WriteString(o.AuthCode)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"wx_appid=\")\n\tbuilder.WriteString(o.WxAppid)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"sub_openid=\")\n\tbuilder.WriteString(o.SubOpenid)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"jump_url=\")\n\tbuilder.WriteString(o.JumpURL)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"notify_url=\")\n\tbuilder.WriteString(o.NotifyURL)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"client_ip=\")\n\tbuilder.WriteString(o.ClientIP)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"attach=\")\n\tbuilder.WriteString(o.Attach)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"order_expiration=\")\n\tbuilder.WriteString(o.OrderExpiration)\n\tbuilder.WriteString(\", \")\n\tbuilder.WriteString(\"extend_params=\")\n\tbuilder.WriteString(o.ExtendParams)\n\tbuilder.WriteByte(')')\n\treturn builder.String()\n}\n\n// Orders is a parsable slice of Order.\ntype Orders []*Order\n\nfunc (o Orders) config(cfg config) {\n\tfor _i := range o {\n\t\to[_i].config = cfg\n\t}\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/order_create.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"entgo.io/ent/dialect/sql/sqlgraph\"\n\t\"entgo.io/ent/schema/field\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/order\"\n)\n\n// OrderCreate is the builder for creating a Order entity.\ntype OrderCreate struct {\n\tconfig\n\tmutation *OrderMutation\n\thooks    []Hook\n}\n\n// SetMerchantID sets the \"merchant_id\" field.\nfunc (oc *OrderCreate) SetMerchantID(s string) *OrderCreate {\n\toc.mutation.SetMerchantID(s)\n\treturn oc\n}\n\n// SetChannel sets the \"channel\" field.\nfunc (oc *OrderCreate) SetChannel(s string) *OrderCreate {\n\toc.mutation.SetChannel(s)\n\treturn oc\n}\n\n// SetPayWay sets the \"pay_way\" field.\nfunc (oc *OrderCreate) SetPayWay(s string) *OrderCreate {\n\toc.mutation.SetPayWay(s)\n\treturn oc\n}\n\n// SetOutOrderNo sets the \"out_order_no\" field.\nfunc (oc *OrderCreate) SetOutOrderNo(s string) *OrderCreate {\n\toc.mutation.SetOutOrderNo(s)\n\treturn oc\n}\n\n// SetTotalAmount sets the \"total_amount\" field.\nfunc (oc *OrderCreate) SetTotalAmount(u uint64) *OrderCreate {\n\toc.mutation.SetTotalAmount(u)\n\treturn oc\n}\n\n// SetBody sets the \"body\" field.\nfunc (oc *OrderCreate) SetBody(s string) *OrderCreate {\n\toc.mutation.SetBody(s)\n\treturn oc\n}\n\n// SetOrderStatus sets the \"order_status\" field.\nfunc (oc *OrderCreate) SetOrderStatus(i int8) *OrderCreate {\n\toc.mutation.SetOrderStatus(i)\n\treturn oc\n}\n\n// SetAuthCode sets the \"auth_code\" field.\nfunc (oc *OrderCreate) SetAuthCode(s string) *OrderCreate {\n\toc.mutation.SetAuthCode(s)\n\treturn oc\n}\n\n// SetWxAppid sets the \"wx_appid\" field.\nfunc (oc *OrderCreate) SetWxAppid(s string) *OrderCreate {\n\toc.mutation.SetWxAppid(s)\n\treturn oc\n}\n\n// SetSubOpenid sets the \"sub_openid\" field.\nfunc (oc *OrderCreate) SetSubOpenid(s string) *OrderCreate {\n\toc.mutation.SetSubOpenid(s)\n\treturn oc\n}\n\n// SetJumpURL sets the \"jump_url\" field.\nfunc (oc *OrderCreate) SetJumpURL(s string) *OrderCreate {\n\toc.mutation.SetJumpURL(s)\n\treturn oc\n}\n\n// SetNotifyURL sets the \"notify_url\" field.\nfunc (oc *OrderCreate) SetNotifyURL(s string) *OrderCreate {\n\toc.mutation.SetNotifyURL(s)\n\treturn oc\n}\n\n// SetClientIP sets the \"client_ip\" field.\nfunc (oc *OrderCreate) SetClientIP(s string) *OrderCreate {\n\toc.mutation.SetClientIP(s)\n\treturn oc\n}\n\n// SetAttach sets the \"attach\" field.\nfunc (oc *OrderCreate) SetAttach(s string) *OrderCreate {\n\toc.mutation.SetAttach(s)\n\treturn oc\n}\n\n// SetOrderExpiration sets the \"order_expiration\" field.\nfunc (oc *OrderCreate) SetOrderExpiration(s string) *OrderCreate {\n\toc.mutation.SetOrderExpiration(s)\n\treturn oc\n}\n\n// SetExtendParams sets the \"extend_params\" field.\nfunc (oc *OrderCreate) SetExtendParams(s string) *OrderCreate {\n\toc.mutation.SetExtendParams(s)\n\treturn oc\n}\n\n// Mutation returns the OrderMutation object of the builder.\nfunc (oc *OrderCreate) Mutation() *OrderMutation {\n\treturn oc.mutation\n}\n\n// Save creates the Order in the database.\nfunc (oc *OrderCreate) Save(ctx context.Context) (*Order, error) {\n\tvar (\n\t\terr  error\n\t\tnode *Order\n\t)\n\tif len(oc.hooks) == 0 {\n\t\tif err = oc.check(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tnode, err = oc.sqlSave(ctx)\n\t} else {\n\t\tvar mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {\n\t\t\tmutation, ok := m.(*OrderMutation)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected mutation type %T\", m)\n\t\t\t}\n\t\t\tif err = oc.check(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\toc.mutation = mutation\n\t\t\tif node, err = oc.sqlSave(ctx); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tmutation.id = &node.ID\n\t\t\tmutation.done = true\n\t\t\treturn node, err\n\t\t})\n\t\tfor i := len(oc.hooks) - 1; i >= 0; i-- {\n\t\t\tif oc.hooks[i] == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"ent: uninitialized hook (forgotten import ent/runtime?)\")\n\t\t\t}\n\t\t\tmut = oc.hooks[i](mut)\n\t\t}\n\t\tv, err := mut.Mutate(ctx, oc.mutation)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tnv, ok := v.(*Order)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"unexpected node type %T returned from OrderMutation\", v)\n\t\t}\n\t\tnode = nv\n\t}\n\treturn node, err\n}\n\n// SaveX calls Save and panics if Save returns an error.\nfunc (oc *OrderCreate) SaveX(ctx context.Context) *Order {\n\tv, err := oc.Save(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// Exec executes the query.\nfunc (oc *OrderCreate) Exec(ctx context.Context) error {\n\t_, err := oc.Save(ctx)\n\treturn err\n}\n\n// ExecX is like Exec, but panics if an error occurs.\nfunc (oc *OrderCreate) ExecX(ctx context.Context) {\n\tif err := oc.Exec(ctx); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// check runs all checks and user-defined validators on the builder.\nfunc (oc *OrderCreate) check() error {\n\tif _, ok := oc.mutation.MerchantID(); !ok {\n\t\treturn &ValidationError{Name: \"merchant_id\", err: errors.New(`ent: missing required field \"Order.merchant_id\"`)}\n\t}\n\tif _, ok := oc.mutation.Channel(); !ok {\n\t\treturn &ValidationError{Name: \"channel\", err: errors.New(`ent: missing required field \"Order.channel\"`)}\n\t}\n\tif _, ok := oc.mutation.PayWay(); !ok {\n\t\treturn &ValidationError{Name: \"pay_way\", err: errors.New(`ent: missing required field \"Order.pay_way\"`)}\n\t}\n\tif _, ok := oc.mutation.OutOrderNo(); !ok {\n\t\treturn &ValidationError{Name: \"out_order_no\", err: errors.New(`ent: missing required field \"Order.out_order_no\"`)}\n\t}\n\tif _, ok := oc.mutation.TotalAmount(); !ok {\n\t\treturn &ValidationError{Name: \"total_amount\", err: errors.New(`ent: missing required field \"Order.total_amount\"`)}\n\t}\n\tif _, ok := oc.mutation.Body(); !ok {\n\t\treturn &ValidationError{Name: \"body\", err: errors.New(`ent: missing required field \"Order.body\"`)}\n\t}\n\tif _, ok := oc.mutation.OrderStatus(); !ok {\n\t\treturn &ValidationError{Name: \"order_status\", err: errors.New(`ent: missing required field \"Order.order_status\"`)}\n\t}\n\tif _, ok := oc.mutation.AuthCode(); !ok {\n\t\treturn &ValidationError{Name: \"auth_code\", err: errors.New(`ent: missing required field \"Order.auth_code\"`)}\n\t}\n\tif _, ok := oc.mutation.WxAppid(); !ok {\n\t\treturn &ValidationError{Name: \"wx_appid\", err: errors.New(`ent: missing required field \"Order.wx_appid\"`)}\n\t}\n\tif _, ok := oc.mutation.SubOpenid(); !ok {\n\t\treturn &ValidationError{Name: \"sub_openid\", err: errors.New(`ent: missing required field \"Order.sub_openid\"`)}\n\t}\n\tif _, ok := oc.mutation.JumpURL(); !ok {\n\t\treturn &ValidationError{Name: \"jump_url\", err: errors.New(`ent: missing required field \"Order.jump_url\"`)}\n\t}\n\tif _, ok := oc.mutation.NotifyURL(); !ok {\n\t\treturn &ValidationError{Name: \"notify_url\", err: errors.New(`ent: missing required field \"Order.notify_url\"`)}\n\t}\n\tif _, ok := oc.mutation.ClientIP(); !ok {\n\t\treturn &ValidationError{Name: \"client_ip\", err: errors.New(`ent: missing required field \"Order.client_ip\"`)}\n\t}\n\tif _, ok := oc.mutation.Attach(); !ok {\n\t\treturn &ValidationError{Name: \"attach\", err: errors.New(`ent: missing required field \"Order.attach\"`)}\n\t}\n\tif _, ok := oc.mutation.OrderExpiration(); !ok {\n\t\treturn &ValidationError{Name: \"order_expiration\", err: errors.New(`ent: missing required field \"Order.order_expiration\"`)}\n\t}\n\tif _, ok := oc.mutation.ExtendParams(); !ok {\n\t\treturn &ValidationError{Name: \"extend_params\", err: errors.New(`ent: missing required field \"Order.extend_params\"`)}\n\t}\n\treturn nil\n}\n\nfunc (oc *OrderCreate) sqlSave(ctx context.Context) (*Order, error) {\n\t_node, _spec := oc.createSpec()\n\tif err := sqlgraph.CreateNode(ctx, oc.driver, _spec); err != nil {\n\t\tif sqlgraph.IsConstraintError(err) {\n\t\t\terr = &ConstraintError{msg: err.Error(), wrap: err}\n\t\t}\n\t\treturn nil, err\n\t}\n\tid := _spec.ID.Value.(int64)\n\t_node.ID = int(id)\n\treturn _node, nil\n}\n\nfunc (oc *OrderCreate) createSpec() (*Order, *sqlgraph.CreateSpec) {\n\tvar (\n\t\t_node = &Order{config: oc.config}\n\t\t_spec = &sqlgraph.CreateSpec{\n\t\t\tTable: order.Table,\n\t\t\tID: &sqlgraph.FieldSpec{\n\t\t\t\tType:   field.TypeInt,\n\t\t\t\tColumn: order.FieldID,\n\t\t\t},\n\t\t}\n\t)\n\tif value, ok := oc.mutation.MerchantID(); ok {\n\t\t_spec.SetField(order.FieldMerchantID, field.TypeString, value)\n\t\t_node.MerchantID = value\n\t}\n\tif value, ok := oc.mutation.Channel(); ok {\n\t\t_spec.SetField(order.FieldChannel, field.TypeString, value)\n\t\t_node.Channel = value\n\t}\n\tif value, ok := oc.mutation.PayWay(); ok {\n\t\t_spec.SetField(order.FieldPayWay, field.TypeString, value)\n\t\t_node.PayWay = value\n\t}\n\tif value, ok := oc.mutation.OutOrderNo(); ok {\n\t\t_spec.SetField(order.FieldOutOrderNo, field.TypeString, value)\n\t\t_node.OutOrderNo = value\n\t}\n\tif value, ok := oc.mutation.TotalAmount(); ok {\n\t\t_spec.SetField(order.FieldTotalAmount, field.TypeUint64, value)\n\t\t_node.TotalAmount = value\n\t}\n\tif value, ok := oc.mutation.Body(); ok {\n\t\t_spec.SetField(order.FieldBody, field.TypeString, value)\n\t\t_node.Body = value\n\t}\n\tif value, ok := oc.mutation.OrderStatus(); ok {\n\t\t_spec.SetField(order.FieldOrderStatus, field.TypeInt8, value)\n\t\t_node.OrderStatus = value\n\t}\n\tif value, ok := oc.mutation.AuthCode(); ok {\n\t\t_spec.SetField(order.FieldAuthCode, field.TypeString, value)\n\t\t_node.AuthCode = value\n\t}\n\tif value, ok := oc.mutation.WxAppid(); ok {\n\t\t_spec.SetField(order.FieldWxAppid, field.TypeString, value)\n\t\t_node.WxAppid = value\n\t}\n\tif value, ok := oc.mutation.SubOpenid(); ok {\n\t\t_spec.SetField(order.FieldSubOpenid, field.TypeString, value)\n\t\t_node.SubOpenid = value\n\t}\n\tif value, ok := oc.mutation.JumpURL(); ok {\n\t\t_spec.SetField(order.FieldJumpURL, field.TypeString, value)\n\t\t_node.JumpURL = value\n\t}\n\tif value, ok := oc.mutation.NotifyURL(); ok {\n\t\t_spec.SetField(order.FieldNotifyURL, field.TypeString, value)\n\t\t_node.NotifyURL = value\n\t}\n\tif value, ok := oc.mutation.ClientIP(); ok {\n\t\t_spec.SetField(order.FieldClientIP, field.TypeString, value)\n\t\t_node.ClientIP = value\n\t}\n\tif value, ok := oc.mutation.Attach(); ok {\n\t\t_spec.SetField(order.FieldAttach, field.TypeString, value)\n\t\t_node.Attach = value\n\t}\n\tif value, ok := oc.mutation.OrderExpiration(); ok {\n\t\t_spec.SetField(order.FieldOrderExpiration, field.TypeString, value)\n\t\t_node.OrderExpiration = value\n\t}\n\tif value, ok := oc.mutation.ExtendParams(); ok {\n\t\t_spec.SetField(order.FieldExtendParams, field.TypeString, value)\n\t\t_node.ExtendParams = value\n\t}\n\treturn _node, _spec\n}\n\n// OrderCreateBulk is the builder for creating many Order entities in bulk.\ntype OrderCreateBulk struct {\n\tconfig\n\tbuilders []*OrderCreate\n}\n\n// Save creates the Order entities in the database.\nfunc (ocb *OrderCreateBulk) Save(ctx context.Context) ([]*Order, error) {\n\tspecs := make([]*sqlgraph.CreateSpec, len(ocb.builders))\n\tnodes := make([]*Order, len(ocb.builders))\n\tmutators := make([]Mutator, len(ocb.builders))\n\tfor i := range ocb.builders {\n\t\tfunc(i int, root context.Context) {\n\t\t\tbuilder := ocb.builders[i]\n\t\t\tvar mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {\n\t\t\t\tmutation, ok := m.(*OrderMutation)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil, fmt.Errorf(\"unexpected mutation type %T\", m)\n\t\t\t\t}\n\t\t\t\tif err := builder.check(); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tbuilder.mutation = mutation\n\t\t\t\tnodes[i], specs[i] = builder.createSpec()\n\t\t\t\tvar err error\n\t\t\t\tif i < len(mutators)-1 {\n\t\t\t\t\t_, err = mutators[i+1].Mutate(root, ocb.builders[i+1].mutation)\n\t\t\t\t} else {\n\t\t\t\t\tspec := &sqlgraph.BatchCreateSpec{Nodes: specs}\n\t\t\t\t\t// Invoke the actual operation on the latest mutation in the chain.\n\t\t\t\t\tif err = sqlgraph.BatchCreate(ctx, ocb.driver, spec); err != nil {\n\t\t\t\t\t\tif sqlgraph.IsConstraintError(err) {\n\t\t\t\t\t\t\terr = &ConstraintError{msg: err.Error(), wrap: err}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tmutation.id = &nodes[i].ID\n\t\t\t\tif specs[i].ID.Value != nil {\n\t\t\t\t\tid := specs[i].ID.Value.(int64)\n\t\t\t\t\tnodes[i].ID = int(id)\n\t\t\t\t}\n\t\t\t\tmutation.done = true\n\t\t\t\treturn nodes[i], nil\n\t\t\t})\n\t\t\tfor i := len(builder.hooks) - 1; i >= 0; i-- {\n\t\t\t\tmut = builder.hooks[i](mut)\n\t\t\t}\n\t\t\tmutators[i] = mut\n\t\t}(i, ctx)\n\t}\n\tif len(mutators) > 0 {\n\t\tif _, err := mutators[0].Mutate(ctx, ocb.builders[0].mutation); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn nodes, nil\n}\n\n// SaveX is like Save, but panics if an error occurs.\nfunc (ocb *OrderCreateBulk) SaveX(ctx context.Context) []*Order {\n\tv, err := ocb.Save(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n\n// Exec executes the query.\nfunc (ocb *OrderCreateBulk) Exec(ctx context.Context) error {\n\t_, err := ocb.Save(ctx)\n\treturn err\n}\n\n// ExecX is like Exec, but panics if an error occurs.\nfunc (ocb *OrderCreateBulk) ExecX(ctx context.Context) {\n\tif err := ocb.Exec(ctx); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/order_delete.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"entgo.io/ent/dialect/sql\"\n\t\"entgo.io/ent/dialect/sql/sqlgraph\"\n\t\"entgo.io/ent/schema/field\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/order\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/predicate\"\n)\n\n// OrderDelete is the builder for deleting a Order entity.\ntype OrderDelete struct {\n\tconfig\n\thooks    []Hook\n\tmutation *OrderMutation\n}\n\n// Where appends a list predicates to the OrderDelete builder.\nfunc (od *OrderDelete) Where(ps ...predicate.Order) *OrderDelete {\n\tod.mutation.Where(ps...)\n\treturn od\n}\n\n// Exec executes the deletion query and returns how many vertices were deleted.\nfunc (od *OrderDelete) Exec(ctx context.Context) (int, error) {\n\tvar (\n\t\terr      error\n\t\taffected int\n\t)\n\tif len(od.hooks) == 0 {\n\t\taffected, err = od.sqlExec(ctx)\n\t} else {\n\t\tvar mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {\n\t\t\tmutation, ok := m.(*OrderMutation)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected mutation type %T\", m)\n\t\t\t}\n\t\t\tod.mutation = mutation\n\t\t\taffected, err = od.sqlExec(ctx)\n\t\t\tmutation.done = true\n\t\t\treturn affected, err\n\t\t})\n\t\tfor i := len(od.hooks) - 1; i >= 0; i-- {\n\t\t\tif od.hooks[i] == nil {\n\t\t\t\treturn 0, fmt.Errorf(\"ent: uninitialized hook (forgotten import ent/runtime?)\")\n\t\t\t}\n\t\t\tmut = od.hooks[i](mut)\n\t\t}\n\t\tif _, err := mut.Mutate(ctx, od.mutation); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\treturn affected, err\n}\n\n// ExecX is like Exec, but panics if an error occurs.\nfunc (od *OrderDelete) ExecX(ctx context.Context) int {\n\tn, err := od.Exec(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn n\n}\n\nfunc (od *OrderDelete) sqlExec(ctx context.Context) (int, error) {\n\t_spec := &sqlgraph.DeleteSpec{\n\t\tNode: &sqlgraph.NodeSpec{\n\t\t\tTable: order.Table,\n\t\t\tID: &sqlgraph.FieldSpec{\n\t\t\t\tType:   field.TypeInt,\n\t\t\t\tColumn: order.FieldID,\n\t\t\t},\n\t\t},\n\t}\n\tif ps := od.mutation.predicates; len(ps) > 0 {\n\t\t_spec.Predicate = func(selector *sql.Selector) {\n\t\t\tfor i := range ps {\n\t\t\t\tps[i](selector)\n\t\t\t}\n\t\t}\n\t}\n\taffected, err := sqlgraph.DeleteNodes(ctx, od.driver, _spec)\n\tif err != nil && sqlgraph.IsConstraintError(err) {\n\t\terr = &ConstraintError{msg: err.Error(), wrap: err}\n\t}\n\treturn affected, err\n}\n\n// OrderDeleteOne is the builder for deleting a single Order entity.\ntype OrderDeleteOne struct {\n\tod *OrderDelete\n}\n\n// Exec executes the deletion query.\nfunc (odo *OrderDeleteOne) Exec(ctx context.Context) error {\n\tn, err := odo.od.Exec(ctx)\n\tswitch {\n\tcase err != nil:\n\t\treturn err\n\tcase n == 0:\n\t\treturn &NotFoundError{order.Label}\n\tdefault:\n\t\treturn nil\n\t}\n}\n\n// ExecX is like Exec, but panics if an error occurs.\nfunc (odo *OrderDeleteOne) ExecX(ctx context.Context) {\n\todo.od.ExecX(ctx)\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/order_query.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"math\"\n\n\t\"entgo.io/ent/dialect/sql\"\n\t\"entgo.io/ent/dialect/sql/sqlgraph\"\n\t\"entgo.io/ent/schema/field\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/order\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/predicate\"\n)\n\n// OrderQuery is the builder for querying Order entities.\ntype OrderQuery struct {\n\tconfig\n\tlimit      *int\n\toffset     *int\n\tunique     *bool\n\torder      []OrderFunc\n\tfields     []string\n\tpredicates []predicate.Order\n\t// intermediate query (i.e. traversal path).\n\tsql  *sql.Selector\n\tpath func(context.Context) (*sql.Selector, error)\n}\n\n// Where adds a new predicate for the OrderQuery builder.\nfunc (oq *OrderQuery) Where(ps ...predicate.Order) *OrderQuery {\n\toq.predicates = append(oq.predicates, ps...)\n\treturn oq\n}\n\n// Limit adds a limit step to the query.\nfunc (oq *OrderQuery) Limit(limit int) *OrderQuery {\n\toq.limit = &limit\n\treturn oq\n}\n\n// Offset adds an offset step to the query.\nfunc (oq *OrderQuery) Offset(offset int) *OrderQuery {\n\toq.offset = &offset\n\treturn oq\n}\n\n// Unique configures the query builder to filter duplicate records on query.\n// By default, unique is set to true, and can be disabled using this method.\nfunc (oq *OrderQuery) Unique(unique bool) *OrderQuery {\n\toq.unique = &unique\n\treturn oq\n}\n\n// Order adds an order step to the query.\nfunc (oq *OrderQuery) Order(o ...OrderFunc) *OrderQuery {\n\toq.order = append(oq.order, o...)\n\treturn oq\n}\n\n// First returns the first Order entity from the query.\n// Returns a *NotFoundError when no Order was found.\nfunc (oq *OrderQuery) First(ctx context.Context) (*Order, error) {\n\tnodes, err := oq.Limit(1).All(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(nodes) == 0 {\n\t\treturn nil, &NotFoundError{order.Label}\n\t}\n\treturn nodes[0], nil\n}\n\n// FirstX is like First, but panics if an error occurs.\nfunc (oq *OrderQuery) FirstX(ctx context.Context) *Order {\n\tnode, err := oq.First(ctx)\n\tif err != nil && !IsNotFound(err) {\n\t\tpanic(err)\n\t}\n\treturn node\n}\n\n// FirstID returns the first Order ID from the query.\n// Returns a *NotFoundError when no Order ID was found.\nfunc (oq *OrderQuery) FirstID(ctx context.Context) (id int, err error) {\n\tvar ids []int\n\tif ids, err = oq.Limit(1).IDs(ctx); err != nil {\n\t\treturn\n\t}\n\tif len(ids) == 0 {\n\t\terr = &NotFoundError{order.Label}\n\t\treturn\n\t}\n\treturn ids[0], nil\n}\n\n// FirstIDX is like FirstID, but panics if an error occurs.\nfunc (oq *OrderQuery) FirstIDX(ctx context.Context) int {\n\tid, err := oq.FirstID(ctx)\n\tif err != nil && !IsNotFound(err) {\n\t\tpanic(err)\n\t}\n\treturn id\n}\n\n// Only returns a single Order entity found by the query, ensuring it only returns one.\n// Returns a *NotSingularError when more than one Order entity is found.\n// Returns a *NotFoundError when no Order entities are found.\nfunc (oq *OrderQuery) Only(ctx context.Context) (*Order, error) {\n\tnodes, err := oq.Limit(2).All(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tswitch len(nodes) {\n\tcase 1:\n\t\treturn nodes[0], nil\n\tcase 0:\n\t\treturn nil, &NotFoundError{order.Label}\n\tdefault:\n\t\treturn nil, &NotSingularError{order.Label}\n\t}\n}\n\n// OnlyX is like Only, but panics if an error occurs.\nfunc (oq *OrderQuery) OnlyX(ctx context.Context) *Order {\n\tnode, err := oq.Only(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn node\n}\n\n// OnlyID is like Only, but returns the only Order ID in the query.\n// Returns a *NotSingularError when more than one Order ID is found.\n// Returns a *NotFoundError when no entities are found.\nfunc (oq *OrderQuery) OnlyID(ctx context.Context) (id int, err error) {\n\tvar ids []int\n\tif ids, err = oq.Limit(2).IDs(ctx); err != nil {\n\t\treturn\n\t}\n\tswitch len(ids) {\n\tcase 1:\n\t\tid = ids[0]\n\tcase 0:\n\t\terr = &NotFoundError{order.Label}\n\tdefault:\n\t\terr = &NotSingularError{order.Label}\n\t}\n\treturn\n}\n\n// OnlyIDX is like OnlyID, but panics if an error occurs.\nfunc (oq *OrderQuery) OnlyIDX(ctx context.Context) int {\n\tid, err := oq.OnlyID(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn id\n}\n\n// All executes the query and returns a list of Orders.\nfunc (oq *OrderQuery) All(ctx context.Context) ([]*Order, error) {\n\tif err := oq.prepareQuery(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn oq.sqlAll(ctx)\n}\n\n// AllX is like All, but panics if an error occurs.\nfunc (oq *OrderQuery) AllX(ctx context.Context) []*Order {\n\tnodes, err := oq.All(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn nodes\n}\n\n// IDs executes the query and returns a list of Order IDs.\nfunc (oq *OrderQuery) IDs(ctx context.Context) ([]int, error) {\n\tvar ids []int\n\tif err := oq.Select(order.FieldID).Scan(ctx, &ids); err != nil {\n\t\treturn nil, err\n\t}\n\treturn ids, nil\n}\n\n// IDsX is like IDs, but panics if an error occurs.\nfunc (oq *OrderQuery) IDsX(ctx context.Context) []int {\n\tids, err := oq.IDs(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn ids\n}\n\n// Count returns the count of the given query.\nfunc (oq *OrderQuery) Count(ctx context.Context) (int, error) {\n\tif err := oq.prepareQuery(ctx); err != nil {\n\t\treturn 0, err\n\t}\n\treturn oq.sqlCount(ctx)\n}\n\n// CountX is like Count, but panics if an error occurs.\nfunc (oq *OrderQuery) CountX(ctx context.Context) int {\n\tcount, err := oq.Count(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn count\n}\n\n// Exist returns true if the query has elements in the graph.\nfunc (oq *OrderQuery) Exist(ctx context.Context) (bool, error) {\n\tif err := oq.prepareQuery(ctx); err != nil {\n\t\treturn false, err\n\t}\n\treturn oq.sqlExist(ctx)\n}\n\n// ExistX is like Exist, but panics if an error occurs.\nfunc (oq *OrderQuery) ExistX(ctx context.Context) bool {\n\texist, err := oq.Exist(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn exist\n}\n\n// Clone returns a duplicate of the OrderQuery builder, including all associated steps. It can be\n// used to prepare common query builders and use them differently after the clone is made.\nfunc (oq *OrderQuery) Clone() *OrderQuery {\n\tif oq == nil {\n\t\treturn nil\n\t}\n\treturn &OrderQuery{\n\t\tconfig:     oq.config,\n\t\tlimit:      oq.limit,\n\t\toffset:     oq.offset,\n\t\torder:      append([]OrderFunc{}, oq.order...),\n\t\tpredicates: append([]predicate.Order{}, oq.predicates...),\n\t\t// clone intermediate query.\n\t\tsql:    oq.sql.Clone(),\n\t\tpath:   oq.path,\n\t\tunique: oq.unique,\n\t}\n}\n\n// GroupBy is used to group vertices by one or more fields/columns.\n// It is often used with aggregate functions, like: count, max, mean, min, sum.\n//\n// Example:\n//\n//\tvar v []struct {\n//\t\tMerchantID string `json:\"merchant_id,omitempty\"`\n//\t\tCount int `json:\"count,omitempty\"`\n//\t}\n//\n//\tclient.Order.Query().\n//\t\tGroupBy(order.FieldMerchantID).\n//\t\tAggregate(ent.Count()).\n//\t\tScan(ctx, &v)\nfunc (oq *OrderQuery) GroupBy(field string, fields ...string) *OrderGroupBy {\n\tgrbuild := &OrderGroupBy{config: oq.config}\n\tgrbuild.fields = append([]string{field}, fields...)\n\tgrbuild.path = func(ctx context.Context) (prev *sql.Selector, err error) {\n\t\tif err := oq.prepareQuery(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn oq.sqlQuery(ctx), nil\n\t}\n\tgrbuild.label = order.Label\n\tgrbuild.flds, grbuild.scan = &grbuild.fields, grbuild.Scan\n\treturn grbuild\n}\n\n// Select allows the selection one or more fields/columns for the given query,\n// instead of selecting all fields in the entity.\n//\n// Example:\n//\n//\tvar v []struct {\n//\t\tMerchantID string `json:\"merchant_id,omitempty\"`\n//\t}\n//\n//\tclient.Order.Query().\n//\t\tSelect(order.FieldMerchantID).\n//\t\tScan(ctx, &v)\nfunc (oq *OrderQuery) Select(fields ...string) *OrderSelect {\n\toq.fields = append(oq.fields, fields...)\n\tselbuild := &OrderSelect{OrderQuery: oq}\n\tselbuild.label = order.Label\n\tselbuild.flds, selbuild.scan = &oq.fields, selbuild.Scan\n\treturn selbuild\n}\n\n// Aggregate returns a OrderSelect configured with the given aggregations.\nfunc (oq *OrderQuery) Aggregate(fns ...AggregateFunc) *OrderSelect {\n\treturn oq.Select().Aggregate(fns...)\n}\n\nfunc (oq *OrderQuery) prepareQuery(ctx context.Context) error {\n\tfor _, f := range oq.fields {\n\t\tif !order.ValidColumn(f) {\n\t\t\treturn &ValidationError{Name: f, err: fmt.Errorf(\"ent: invalid field %q for query\", f)}\n\t\t}\n\t}\n\tif oq.path != nil {\n\t\tprev, err := oq.path(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\toq.sql = prev\n\t}\n\treturn nil\n}\n\nfunc (oq *OrderQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Order, error) {\n\tvar (\n\t\tnodes = []*Order{}\n\t\t_spec = oq.querySpec()\n\t)\n\t_spec.ScanValues = func(columns []string) ([]any, error) {\n\t\treturn (*Order).scanValues(nil, columns)\n\t}\n\t_spec.Assign = func(columns []string, values []any) error {\n\t\tnode := &Order{config: oq.config}\n\t\tnodes = append(nodes, node)\n\t\treturn node.assignValues(columns, values)\n\t}\n\tfor i := range hooks {\n\t\thooks[i](ctx, _spec)\n\t}\n\tif err := sqlgraph.QueryNodes(ctx, oq.driver, _spec); err != nil {\n\t\treturn nil, err\n\t}\n\tif len(nodes) == 0 {\n\t\treturn nodes, nil\n\t}\n\treturn nodes, nil\n}\n\nfunc (oq *OrderQuery) sqlCount(ctx context.Context) (int, error) {\n\t_spec := oq.querySpec()\n\t_spec.Node.Columns = oq.fields\n\tif len(oq.fields) > 0 {\n\t\t_spec.Unique = oq.unique != nil && *oq.unique\n\t}\n\treturn sqlgraph.CountNodes(ctx, oq.driver, _spec)\n}\n\nfunc (oq *OrderQuery) sqlExist(ctx context.Context) (bool, error) {\n\tswitch _, err := oq.FirstID(ctx); {\n\tcase IsNotFound(err):\n\t\treturn false, nil\n\tcase err != nil:\n\t\treturn false, fmt.Errorf(\"ent: check existence: %w\", err)\n\tdefault:\n\t\treturn true, nil\n\t}\n}\n\nfunc (oq *OrderQuery) querySpec() *sqlgraph.QuerySpec {\n\t_spec := &sqlgraph.QuerySpec{\n\t\tNode: &sqlgraph.NodeSpec{\n\t\t\tTable:   order.Table,\n\t\t\tColumns: order.Columns,\n\t\t\tID: &sqlgraph.FieldSpec{\n\t\t\t\tType:   field.TypeInt,\n\t\t\t\tColumn: order.FieldID,\n\t\t\t},\n\t\t},\n\t\tFrom:   oq.sql,\n\t\tUnique: true,\n\t}\n\tif unique := oq.unique; unique != nil {\n\t\t_spec.Unique = *unique\n\t}\n\tif fields := oq.fields; len(fields) > 0 {\n\t\t_spec.Node.Columns = make([]string, 0, len(fields))\n\t\t_spec.Node.Columns = append(_spec.Node.Columns, order.FieldID)\n\t\tfor i := range fields {\n\t\t\tif fields[i] != order.FieldID {\n\t\t\t\t_spec.Node.Columns = append(_spec.Node.Columns, fields[i])\n\t\t\t}\n\t\t}\n\t}\n\tif ps := oq.predicates; len(ps) > 0 {\n\t\t_spec.Predicate = func(selector *sql.Selector) {\n\t\t\tfor i := range ps {\n\t\t\t\tps[i](selector)\n\t\t\t}\n\t\t}\n\t}\n\tif limit := oq.limit; limit != nil {\n\t\t_spec.Limit = *limit\n\t}\n\tif offset := oq.offset; offset != nil {\n\t\t_spec.Offset = *offset\n\t}\n\tif ps := oq.order; len(ps) > 0 {\n\t\t_spec.Order = func(selector *sql.Selector) {\n\t\t\tfor i := range ps {\n\t\t\t\tps[i](selector)\n\t\t\t}\n\t\t}\n\t}\n\treturn _spec\n}\n\nfunc (oq *OrderQuery) sqlQuery(ctx context.Context) *sql.Selector {\n\tbuilder := sql.Dialect(oq.driver.Dialect())\n\tt1 := builder.Table(order.Table)\n\tcolumns := oq.fields\n\tif len(columns) == 0 {\n\t\tcolumns = order.Columns\n\t}\n\tselector := builder.Select(t1.Columns(columns...)...).From(t1)\n\tif oq.sql != nil {\n\t\tselector = oq.sql\n\t\tselector.Select(selector.Columns(columns...)...)\n\t}\n\tif oq.unique != nil && *oq.unique {\n\t\tselector.Distinct()\n\t}\n\tfor _, p := range oq.predicates {\n\t\tp(selector)\n\t}\n\tfor _, p := range oq.order {\n\t\tp(selector)\n\t}\n\tif offset := oq.offset; offset != nil {\n\t\t// limit is mandatory for offset clause. We start\n\t\t// with default value, and override it below if needed.\n\t\tselector.Offset(*offset).Limit(math.MaxInt32)\n\t}\n\tif limit := oq.limit; limit != nil {\n\t\tselector.Limit(*limit)\n\t}\n\treturn selector\n}\n\n// OrderGroupBy is the group-by builder for Order entities.\ntype OrderGroupBy struct {\n\tconfig\n\tselector\n\tfields []string\n\tfns    []AggregateFunc\n\t// intermediate query (i.e. traversal path).\n\tsql  *sql.Selector\n\tpath func(context.Context) (*sql.Selector, error)\n}\n\n// Aggregate adds the given aggregation functions to the group-by query.\nfunc (ogb *OrderGroupBy) Aggregate(fns ...AggregateFunc) *OrderGroupBy {\n\togb.fns = append(ogb.fns, fns...)\n\treturn ogb\n}\n\n// Scan applies the group-by query and scans the result into the given value.\nfunc (ogb *OrderGroupBy) Scan(ctx context.Context, v any) error {\n\tquery, err := ogb.path(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\togb.sql = query\n\treturn ogb.sqlScan(ctx, v)\n}\n\nfunc (ogb *OrderGroupBy) sqlScan(ctx context.Context, v any) error {\n\tfor _, f := range ogb.fields {\n\t\tif !order.ValidColumn(f) {\n\t\t\treturn &ValidationError{Name: f, err: fmt.Errorf(\"invalid field %q for group-by\", f)}\n\t\t}\n\t}\n\tselector := ogb.sqlQuery()\n\tif err := selector.Err(); err != nil {\n\t\treturn err\n\t}\n\trows := &sql.Rows{}\n\tquery, args := selector.Query()\n\tif err := ogb.driver.Query(ctx, query, args, rows); err != nil {\n\t\treturn err\n\t}\n\tdefer rows.Close()\n\treturn sql.ScanSlice(rows, v)\n}\n\nfunc (ogb *OrderGroupBy) sqlQuery() *sql.Selector {\n\tselector := ogb.sql.Select()\n\taggregation := make([]string, 0, len(ogb.fns))\n\tfor _, fn := range ogb.fns {\n\t\taggregation = append(aggregation, fn(selector))\n\t}\n\tif len(selector.SelectedColumns()) == 0 {\n\t\tcolumns := make([]string, 0, len(ogb.fields)+len(ogb.fns))\n\t\tfor _, f := range ogb.fields {\n\t\t\tcolumns = append(columns, selector.C(f))\n\t\t}\n\t\tcolumns = append(columns, aggregation...)\n\t\tselector.Select(columns...)\n\t}\n\treturn selector.GroupBy(selector.Columns(ogb.fields...)...)\n}\n\n// OrderSelect is the builder for selecting fields of Order entities.\ntype OrderSelect struct {\n\t*OrderQuery\n\tselector\n\t// intermediate query (i.e. traversal path).\n\tsql *sql.Selector\n}\n\n// Aggregate adds the given aggregation functions to the selector query.\nfunc (os *OrderSelect) Aggregate(fns ...AggregateFunc) *OrderSelect {\n\tos.fns = append(os.fns, fns...)\n\treturn os\n}\n\n// Scan applies the selector query and scans the result into the given value.\nfunc (os *OrderSelect) Scan(ctx context.Context, v any) error {\n\tif err := os.prepareQuery(ctx); err != nil {\n\t\treturn err\n\t}\n\tos.sql = os.OrderQuery.sqlQuery(ctx)\n\treturn os.sqlScan(ctx, v)\n}\n\nfunc (os *OrderSelect) sqlScan(ctx context.Context, v any) error {\n\taggregation := make([]string, 0, len(os.fns))\n\tfor _, fn := range os.fns {\n\t\taggregation = append(aggregation, fn(os.sql))\n\t}\n\tswitch n := len(*os.selector.flds); {\n\tcase n == 0 && len(aggregation) > 0:\n\t\tos.sql.Select(aggregation...)\n\tcase n != 0 && len(aggregation) > 0:\n\t\tos.sql.AppendSelect(aggregation...)\n\t}\n\trows := &sql.Rows{}\n\tquery, args := os.sql.Query()\n\tif err := os.driver.Query(ctx, query, args, rows); err != nil {\n\t\treturn err\n\t}\n\tdefer rows.Close()\n\treturn sql.ScanSlice(rows, v)\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/order_update.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"entgo.io/ent/dialect/sql\"\n\t\"entgo.io/ent/dialect/sql/sqlgraph\"\n\t\"entgo.io/ent/schema/field\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/order\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/predicate\"\n)\n\n// OrderUpdate is the builder for updating Order entities.\ntype OrderUpdate struct {\n\tconfig\n\thooks    []Hook\n\tmutation *OrderMutation\n}\n\n// Where appends a list predicates to the OrderUpdate builder.\nfunc (ou *OrderUpdate) Where(ps ...predicate.Order) *OrderUpdate {\n\tou.mutation.Where(ps...)\n\treturn ou\n}\n\n// SetMerchantID sets the \"merchant_id\" field.\nfunc (ou *OrderUpdate) SetMerchantID(s string) *OrderUpdate {\n\tou.mutation.SetMerchantID(s)\n\treturn ou\n}\n\n// SetChannel sets the \"channel\" field.\nfunc (ou *OrderUpdate) SetChannel(s string) *OrderUpdate {\n\tou.mutation.SetChannel(s)\n\treturn ou\n}\n\n// SetPayWay sets the \"pay_way\" field.\nfunc (ou *OrderUpdate) SetPayWay(s string) *OrderUpdate {\n\tou.mutation.SetPayWay(s)\n\treturn ou\n}\n\n// SetOutOrderNo sets the \"out_order_no\" field.\nfunc (ou *OrderUpdate) SetOutOrderNo(s string) *OrderUpdate {\n\tou.mutation.SetOutOrderNo(s)\n\treturn ou\n}\n\n// SetTotalAmount sets the \"total_amount\" field.\nfunc (ou *OrderUpdate) SetTotalAmount(u uint64) *OrderUpdate {\n\tou.mutation.ResetTotalAmount()\n\tou.mutation.SetTotalAmount(u)\n\treturn ou\n}\n\n// AddTotalAmount adds u to the \"total_amount\" field.\nfunc (ou *OrderUpdate) AddTotalAmount(u int64) *OrderUpdate {\n\tou.mutation.AddTotalAmount(u)\n\treturn ou\n}\n\n// SetBody sets the \"body\" field.\nfunc (ou *OrderUpdate) SetBody(s string) *OrderUpdate {\n\tou.mutation.SetBody(s)\n\treturn ou\n}\n\n// SetOrderStatus sets the \"order_status\" field.\nfunc (ou *OrderUpdate) SetOrderStatus(i int8) *OrderUpdate {\n\tou.mutation.ResetOrderStatus()\n\tou.mutation.SetOrderStatus(i)\n\treturn ou\n}\n\n// AddOrderStatus adds i to the \"order_status\" field.\nfunc (ou *OrderUpdate) AddOrderStatus(i int8) *OrderUpdate {\n\tou.mutation.AddOrderStatus(i)\n\treturn ou\n}\n\n// SetAuthCode sets the \"auth_code\" field.\nfunc (ou *OrderUpdate) SetAuthCode(s string) *OrderUpdate {\n\tou.mutation.SetAuthCode(s)\n\treturn ou\n}\n\n// SetWxAppid sets the \"wx_appid\" field.\nfunc (ou *OrderUpdate) SetWxAppid(s string) *OrderUpdate {\n\tou.mutation.SetWxAppid(s)\n\treturn ou\n}\n\n// SetSubOpenid sets the \"sub_openid\" field.\nfunc (ou *OrderUpdate) SetSubOpenid(s string) *OrderUpdate {\n\tou.mutation.SetSubOpenid(s)\n\treturn ou\n}\n\n// SetJumpURL sets the \"jump_url\" field.\nfunc (ou *OrderUpdate) SetJumpURL(s string) *OrderUpdate {\n\tou.mutation.SetJumpURL(s)\n\treturn ou\n}\n\n// SetNotifyURL sets the \"notify_url\" field.\nfunc (ou *OrderUpdate) SetNotifyURL(s string) *OrderUpdate {\n\tou.mutation.SetNotifyURL(s)\n\treturn ou\n}\n\n// SetClientIP sets the \"client_ip\" field.\nfunc (ou *OrderUpdate) SetClientIP(s string) *OrderUpdate {\n\tou.mutation.SetClientIP(s)\n\treturn ou\n}\n\n// SetAttach sets the \"attach\" field.\nfunc (ou *OrderUpdate) SetAttach(s string) *OrderUpdate {\n\tou.mutation.SetAttach(s)\n\treturn ou\n}\n\n// SetOrderExpiration sets the \"order_expiration\" field.\nfunc (ou *OrderUpdate) SetOrderExpiration(s string) *OrderUpdate {\n\tou.mutation.SetOrderExpiration(s)\n\treturn ou\n}\n\n// SetExtendParams sets the \"extend_params\" field.\nfunc (ou *OrderUpdate) SetExtendParams(s string) *OrderUpdate {\n\tou.mutation.SetExtendParams(s)\n\treturn ou\n}\n\n// Mutation returns the OrderMutation object of the builder.\nfunc (ou *OrderUpdate) Mutation() *OrderMutation {\n\treturn ou.mutation\n}\n\n// Save executes the query and returns the number of nodes affected by the update operation.\nfunc (ou *OrderUpdate) Save(ctx context.Context) (int, error) {\n\tvar (\n\t\terr      error\n\t\taffected int\n\t)\n\tif len(ou.hooks) == 0 {\n\t\taffected, err = ou.sqlSave(ctx)\n\t} else {\n\t\tvar mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {\n\t\t\tmutation, ok := m.(*OrderMutation)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected mutation type %T\", m)\n\t\t\t}\n\t\t\tou.mutation = mutation\n\t\t\taffected, err = ou.sqlSave(ctx)\n\t\t\tmutation.done = true\n\t\t\treturn affected, err\n\t\t})\n\t\tfor i := len(ou.hooks) - 1; i >= 0; i-- {\n\t\t\tif ou.hooks[i] == nil {\n\t\t\t\treturn 0, fmt.Errorf(\"ent: uninitialized hook (forgotten import ent/runtime?)\")\n\t\t\t}\n\t\t\tmut = ou.hooks[i](mut)\n\t\t}\n\t\tif _, err := mut.Mutate(ctx, ou.mutation); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\treturn affected, err\n}\n\n// SaveX is like Save, but panics if an error occurs.\nfunc (ou *OrderUpdate) SaveX(ctx context.Context) int {\n\taffected, err := ou.Save(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn affected\n}\n\n// Exec executes the query.\nfunc (ou *OrderUpdate) Exec(ctx context.Context) error {\n\t_, err := ou.Save(ctx)\n\treturn err\n}\n\n// ExecX is like Exec, but panics if an error occurs.\nfunc (ou *OrderUpdate) ExecX(ctx context.Context) {\n\tif err := ou.Exec(ctx); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc (ou *OrderUpdate) sqlSave(ctx context.Context) (n int, err error) {\n\t_spec := &sqlgraph.UpdateSpec{\n\t\tNode: &sqlgraph.NodeSpec{\n\t\t\tTable:   order.Table,\n\t\t\tColumns: order.Columns,\n\t\t\tID: &sqlgraph.FieldSpec{\n\t\t\t\tType:   field.TypeInt,\n\t\t\t\tColumn: order.FieldID,\n\t\t\t},\n\t\t},\n\t}\n\tif ps := ou.mutation.predicates; len(ps) > 0 {\n\t\t_spec.Predicate = func(selector *sql.Selector) {\n\t\t\tfor i := range ps {\n\t\t\t\tps[i](selector)\n\t\t\t}\n\t\t}\n\t}\n\tif value, ok := ou.mutation.MerchantID(); ok {\n\t\t_spec.SetField(order.FieldMerchantID, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.Channel(); ok {\n\t\t_spec.SetField(order.FieldChannel, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.PayWay(); ok {\n\t\t_spec.SetField(order.FieldPayWay, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.OutOrderNo(); ok {\n\t\t_spec.SetField(order.FieldOutOrderNo, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.TotalAmount(); ok {\n\t\t_spec.SetField(order.FieldTotalAmount, field.TypeUint64, value)\n\t}\n\tif value, ok := ou.mutation.AddedTotalAmount(); ok {\n\t\t_spec.AddField(order.FieldTotalAmount, field.TypeUint64, value)\n\t}\n\tif value, ok := ou.mutation.Body(); ok {\n\t\t_spec.SetField(order.FieldBody, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.OrderStatus(); ok {\n\t\t_spec.SetField(order.FieldOrderStatus, field.TypeInt8, value)\n\t}\n\tif value, ok := ou.mutation.AddedOrderStatus(); ok {\n\t\t_spec.AddField(order.FieldOrderStatus, field.TypeInt8, value)\n\t}\n\tif value, ok := ou.mutation.AuthCode(); ok {\n\t\t_spec.SetField(order.FieldAuthCode, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.WxAppid(); ok {\n\t\t_spec.SetField(order.FieldWxAppid, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.SubOpenid(); ok {\n\t\t_spec.SetField(order.FieldSubOpenid, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.JumpURL(); ok {\n\t\t_spec.SetField(order.FieldJumpURL, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.NotifyURL(); ok {\n\t\t_spec.SetField(order.FieldNotifyURL, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.ClientIP(); ok {\n\t\t_spec.SetField(order.FieldClientIP, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.Attach(); ok {\n\t\t_spec.SetField(order.FieldAttach, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.OrderExpiration(); ok {\n\t\t_spec.SetField(order.FieldOrderExpiration, field.TypeString, value)\n\t}\n\tif value, ok := ou.mutation.ExtendParams(); ok {\n\t\t_spec.SetField(order.FieldExtendParams, field.TypeString, value)\n\t}\n\tif n, err = sqlgraph.UpdateNodes(ctx, ou.driver, _spec); err != nil {\n\t\tif _, ok := err.(*sqlgraph.NotFoundError); ok {\n\t\t\terr = &NotFoundError{order.Label}\n\t\t} else if sqlgraph.IsConstraintError(err) {\n\t\t\terr = &ConstraintError{msg: err.Error(), wrap: err}\n\t\t}\n\t\treturn 0, err\n\t}\n\treturn n, nil\n}\n\n// OrderUpdateOne is the builder for updating a single Order entity.\ntype OrderUpdateOne struct {\n\tconfig\n\tfields   []string\n\thooks    []Hook\n\tmutation *OrderMutation\n}\n\n// SetMerchantID sets the \"merchant_id\" field.\nfunc (ouo *OrderUpdateOne) SetMerchantID(s string) *OrderUpdateOne {\n\touo.mutation.SetMerchantID(s)\n\treturn ouo\n}\n\n// SetChannel sets the \"channel\" field.\nfunc (ouo *OrderUpdateOne) SetChannel(s string) *OrderUpdateOne {\n\touo.mutation.SetChannel(s)\n\treturn ouo\n}\n\n// SetPayWay sets the \"pay_way\" field.\nfunc (ouo *OrderUpdateOne) SetPayWay(s string) *OrderUpdateOne {\n\touo.mutation.SetPayWay(s)\n\treturn ouo\n}\n\n// SetOutOrderNo sets the \"out_order_no\" field.\nfunc (ouo *OrderUpdateOne) SetOutOrderNo(s string) *OrderUpdateOne {\n\touo.mutation.SetOutOrderNo(s)\n\treturn ouo\n}\n\n// SetTotalAmount sets the \"total_amount\" field.\nfunc (ouo *OrderUpdateOne) SetTotalAmount(u uint64) *OrderUpdateOne {\n\touo.mutation.ResetTotalAmount()\n\touo.mutation.SetTotalAmount(u)\n\treturn ouo\n}\n\n// AddTotalAmount adds u to the \"total_amount\" field.\nfunc (ouo *OrderUpdateOne) AddTotalAmount(u int64) *OrderUpdateOne {\n\touo.mutation.AddTotalAmount(u)\n\treturn ouo\n}\n\n// SetBody sets the \"body\" field.\nfunc (ouo *OrderUpdateOne) SetBody(s string) *OrderUpdateOne {\n\touo.mutation.SetBody(s)\n\treturn ouo\n}\n\n// SetOrderStatus sets the \"order_status\" field.\nfunc (ouo *OrderUpdateOne) SetOrderStatus(i int8) *OrderUpdateOne {\n\touo.mutation.ResetOrderStatus()\n\touo.mutation.SetOrderStatus(i)\n\treturn ouo\n}\n\n// AddOrderStatus adds i to the \"order_status\" field.\nfunc (ouo *OrderUpdateOne) AddOrderStatus(i int8) *OrderUpdateOne {\n\touo.mutation.AddOrderStatus(i)\n\treturn ouo\n}\n\n// SetAuthCode sets the \"auth_code\" field.\nfunc (ouo *OrderUpdateOne) SetAuthCode(s string) *OrderUpdateOne {\n\touo.mutation.SetAuthCode(s)\n\treturn ouo\n}\n\n// SetWxAppid sets the \"wx_appid\" field.\nfunc (ouo *OrderUpdateOne) SetWxAppid(s string) *OrderUpdateOne {\n\touo.mutation.SetWxAppid(s)\n\treturn ouo\n}\n\n// SetSubOpenid sets the \"sub_openid\" field.\nfunc (ouo *OrderUpdateOne) SetSubOpenid(s string) *OrderUpdateOne {\n\touo.mutation.SetSubOpenid(s)\n\treturn ouo\n}\n\n// SetJumpURL sets the \"jump_url\" field.\nfunc (ouo *OrderUpdateOne) SetJumpURL(s string) *OrderUpdateOne {\n\touo.mutation.SetJumpURL(s)\n\treturn ouo\n}\n\n// SetNotifyURL sets the \"notify_url\" field.\nfunc (ouo *OrderUpdateOne) SetNotifyURL(s string) *OrderUpdateOne {\n\touo.mutation.SetNotifyURL(s)\n\treturn ouo\n}\n\n// SetClientIP sets the \"client_ip\" field.\nfunc (ouo *OrderUpdateOne) SetClientIP(s string) *OrderUpdateOne {\n\touo.mutation.SetClientIP(s)\n\treturn ouo\n}\n\n// SetAttach sets the \"attach\" field.\nfunc (ouo *OrderUpdateOne) SetAttach(s string) *OrderUpdateOne {\n\touo.mutation.SetAttach(s)\n\treturn ouo\n}\n\n// SetOrderExpiration sets the \"order_expiration\" field.\nfunc (ouo *OrderUpdateOne) SetOrderExpiration(s string) *OrderUpdateOne {\n\touo.mutation.SetOrderExpiration(s)\n\treturn ouo\n}\n\n// SetExtendParams sets the \"extend_params\" field.\nfunc (ouo *OrderUpdateOne) SetExtendParams(s string) *OrderUpdateOne {\n\touo.mutation.SetExtendParams(s)\n\treturn ouo\n}\n\n// Mutation returns the OrderMutation object of the builder.\nfunc (ouo *OrderUpdateOne) Mutation() *OrderMutation {\n\treturn ouo.mutation\n}\n\n// Select allows selecting one or more fields (columns) of the returned entity.\n// The default is selecting all fields defined in the entity schema.\nfunc (ouo *OrderUpdateOne) Select(field string, fields ...string) *OrderUpdateOne {\n\touo.fields = append([]string{field}, fields...)\n\treturn ouo\n}\n\n// Save executes the query and returns the updated Order entity.\nfunc (ouo *OrderUpdateOne) Save(ctx context.Context) (*Order, error) {\n\tvar (\n\t\terr  error\n\t\tnode *Order\n\t)\n\tif len(ouo.hooks) == 0 {\n\t\tnode, err = ouo.sqlSave(ctx)\n\t} else {\n\t\tvar mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {\n\t\t\tmutation, ok := m.(*OrderMutation)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected mutation type %T\", m)\n\t\t\t}\n\t\t\touo.mutation = mutation\n\t\t\tnode, err = ouo.sqlSave(ctx)\n\t\t\tmutation.done = true\n\t\t\treturn node, err\n\t\t})\n\t\tfor i := len(ouo.hooks) - 1; i >= 0; i-- {\n\t\t\tif ouo.hooks[i] == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"ent: uninitialized hook (forgotten import ent/runtime?)\")\n\t\t\t}\n\t\t\tmut = ouo.hooks[i](mut)\n\t\t}\n\t\tv, err := mut.Mutate(ctx, ouo.mutation)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tnv, ok := v.(*Order)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"unexpected node type %T returned from OrderMutation\", v)\n\t\t}\n\t\tnode = nv\n\t}\n\treturn node, err\n}\n\n// SaveX is like Save, but panics if an error occurs.\nfunc (ouo *OrderUpdateOne) SaveX(ctx context.Context) *Order {\n\tnode, err := ouo.Save(ctx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn node\n}\n\n// Exec executes the query on the entity.\nfunc (ouo *OrderUpdateOne) Exec(ctx context.Context) error {\n\t_, err := ouo.Save(ctx)\n\treturn err\n}\n\n// ExecX is like Exec, but panics if an error occurs.\nfunc (ouo *OrderUpdateOne) ExecX(ctx context.Context) {\n\tif err := ouo.Exec(ctx); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc (ouo *OrderUpdateOne) sqlSave(ctx context.Context) (_node *Order, err error) {\n\t_spec := &sqlgraph.UpdateSpec{\n\t\tNode: &sqlgraph.NodeSpec{\n\t\t\tTable:   order.Table,\n\t\t\tColumns: order.Columns,\n\t\t\tID: &sqlgraph.FieldSpec{\n\t\t\t\tType:   field.TypeInt,\n\t\t\t\tColumn: order.FieldID,\n\t\t\t},\n\t\t},\n\t}\n\tid, ok := ouo.mutation.ID()\n\tif !ok {\n\t\treturn nil, &ValidationError{Name: \"id\", err: errors.New(`ent: missing \"Order.id\" for update`)}\n\t}\n\t_spec.Node.ID.Value = id\n\tif fields := ouo.fields; len(fields) > 0 {\n\t\t_spec.Node.Columns = make([]string, 0, len(fields))\n\t\t_spec.Node.Columns = append(_spec.Node.Columns, order.FieldID)\n\t\tfor _, f := range fields {\n\t\t\tif !order.ValidColumn(f) {\n\t\t\t\treturn nil, &ValidationError{Name: f, err: fmt.Errorf(\"ent: invalid field %q for query\", f)}\n\t\t\t}\n\t\t\tif f != order.FieldID {\n\t\t\t\t_spec.Node.Columns = append(_spec.Node.Columns, f)\n\t\t\t}\n\t\t}\n\t}\n\tif ps := ouo.mutation.predicates; len(ps) > 0 {\n\t\t_spec.Predicate = func(selector *sql.Selector) {\n\t\t\tfor i := range ps {\n\t\t\t\tps[i](selector)\n\t\t\t}\n\t\t}\n\t}\n\tif value, ok := ouo.mutation.MerchantID(); ok {\n\t\t_spec.SetField(order.FieldMerchantID, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.Channel(); ok {\n\t\t_spec.SetField(order.FieldChannel, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.PayWay(); ok {\n\t\t_spec.SetField(order.FieldPayWay, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.OutOrderNo(); ok {\n\t\t_spec.SetField(order.FieldOutOrderNo, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.TotalAmount(); ok {\n\t\t_spec.SetField(order.FieldTotalAmount, field.TypeUint64, value)\n\t}\n\tif value, ok := ouo.mutation.AddedTotalAmount(); ok {\n\t\t_spec.AddField(order.FieldTotalAmount, field.TypeUint64, value)\n\t}\n\tif value, ok := ouo.mutation.Body(); ok {\n\t\t_spec.SetField(order.FieldBody, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.OrderStatus(); ok {\n\t\t_spec.SetField(order.FieldOrderStatus, field.TypeInt8, value)\n\t}\n\tif value, ok := ouo.mutation.AddedOrderStatus(); ok {\n\t\t_spec.AddField(order.FieldOrderStatus, field.TypeInt8, value)\n\t}\n\tif value, ok := ouo.mutation.AuthCode(); ok {\n\t\t_spec.SetField(order.FieldAuthCode, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.WxAppid(); ok {\n\t\t_spec.SetField(order.FieldWxAppid, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.SubOpenid(); ok {\n\t\t_spec.SetField(order.FieldSubOpenid, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.JumpURL(); ok {\n\t\t_spec.SetField(order.FieldJumpURL, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.NotifyURL(); ok {\n\t\t_spec.SetField(order.FieldNotifyURL, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.ClientIP(); ok {\n\t\t_spec.SetField(order.FieldClientIP, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.Attach(); ok {\n\t\t_spec.SetField(order.FieldAttach, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.OrderExpiration(); ok {\n\t\t_spec.SetField(order.FieldOrderExpiration, field.TypeString, value)\n\t}\n\tif value, ok := ouo.mutation.ExtendParams(); ok {\n\t\t_spec.SetField(order.FieldExtendParams, field.TypeString, value)\n\t}\n\t_node = &Order{config: ouo.config}\n\t_spec.Assign = _node.assignValues\n\t_spec.ScanValues = _node.scanValues\n\tif err = sqlgraph.UpdateNode(ctx, ouo.driver, _spec); err != nil {\n\t\tif _, ok := err.(*sqlgraph.NotFoundError); ok {\n\t\t\terr = &NotFoundError{order.Label}\n\t\t} else if sqlgraph.IsConstraintError(err) {\n\t\t\terr = &ConstraintError{msg: err.Error(), wrap: err}\n\t\t}\n\t\treturn nil, err\n\t}\n\treturn _node, nil\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/predicate/predicate.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage predicate\n\nimport (\n\t\"entgo.io/ent/dialect/sql\"\n)\n\n// Order is the predicate function for order builders.\ntype Order func(*sql.Selector)\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/runtime/runtime.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage runtime\n\n// The schema-stitching logic is generated in github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/runtime.go\n\nconst (\n\tVersion = \"v0.11.4\"                                         // Version of ent codegen.\n\tSum     = \"h1:grwVY0fp31BZ6oEo3YrXenAuv8VJmEw7F/Bi6WqeH3Q=\" // Sum of ent codegen.\n)\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/runtime.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\n// The init function reads all schema descriptors with runtime code\n// (default values, validators, hooks and policies) and stitches it\n// to their package variables.\nfunc init() {\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/schema/order.go",
    "content": "package schema\n\nimport (\n\t\"entgo.io/ent\"\n\t\"entgo.io/ent/schema/field\"\n)\n\n// Order holds the schema definition for the Order entity.\ntype Order struct {\n\tent.Schema\n}\n\n// Fields of the Order.\nfunc (Order) Fields() []ent.Field {\n\treturn []ent.Field{\n\t\tfield.String(\"merchant_id\"),\n\t\tfield.String(\"channel\"),\n\t\tfield.String(\"pay_way\"),\n\n\t\tfield.String(\"out_order_no\"),\n\t\tfield.Uint64(\"total_amount\"),\n\t\tfield.String(\"body\"),\n\t\tfield.Int8(\"order_status\"),\n\n\t\tfield.String(\"auth_code\"),\n\n\t\tfield.String(\"wx_appid\"),\n\t\tfield.String(\"sub_openid\"),\n\n\t\tfield.String(\"jump_url\"),\n\t\tfield.String(\"notify_url\"),\n\n\t\tfield.String(\"client_ip\"),\n\t\tfield.String(\"attach\"),\n\t\tfield.String(\"order_expiration\"),\n\t\tfield.String(\"extend_params\"),\n\t}\n}\n\n// Edges of the Order.\nfunc (Order) Edges() []ent.Edge {\n\treturn nil\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/ent/tx.go",
    "content": "// Code generated by ent, DO NOT EDIT.\n\npackage ent\n\nimport (\n\t\"context\"\n\t\"sync\"\n\n\t\"entgo.io/ent/dialect\"\n)\n\n// Tx is a transactional client that is created by calling Client.Tx().\ntype Tx struct {\n\tconfig\n\t// Order is the client for interacting with the Order builders.\n\tOrder *OrderClient\n\n\t// lazily loaded.\n\tclient     *Client\n\tclientOnce sync.Once\n\t// ctx lives for the life of the transaction. It is\n\t// the same context used by the underlying connection.\n\tctx context.Context\n}\n\ntype (\n\t// Committer is the interface that wraps the Commit method.\n\tCommitter interface {\n\t\tCommit(context.Context, *Tx) error\n\t}\n\n\t// The CommitFunc type is an adapter to allow the use of ordinary\n\t// function as a Committer. If f is a function with the appropriate\n\t// signature, CommitFunc(f) is a Committer that calls f.\n\tCommitFunc func(context.Context, *Tx) error\n\n\t// CommitHook defines the \"commit middleware\". A function that gets a Committer\n\t// and returns a Committer. For example:\n\t//\n\t//\thook := func(next ent.Committer) ent.Committer {\n\t//\t\treturn ent.CommitFunc(func(ctx context.Context, tx *ent.Tx) error {\n\t//\t\t\t// Do some stuff before.\n\t//\t\t\tif err := next.Commit(ctx, tx); err != nil {\n\t//\t\t\t\treturn err\n\t//\t\t\t}\n\t//\t\t\t// Do some stuff after.\n\t//\t\t\treturn nil\n\t//\t\t})\n\t//\t}\n\t//\n\tCommitHook func(Committer) Committer\n)\n\n// Commit calls f(ctx, m).\nfunc (f CommitFunc) Commit(ctx context.Context, tx *Tx) error {\n\treturn f(ctx, tx)\n}\n\n// Commit commits the transaction.\nfunc (tx *Tx) Commit() error {\n\ttxDriver := tx.config.driver.(*txDriver)\n\tvar fn Committer = CommitFunc(func(context.Context, *Tx) error {\n\t\treturn txDriver.tx.Commit()\n\t})\n\ttxDriver.mu.Lock()\n\thooks := append([]CommitHook(nil), txDriver.onCommit...)\n\ttxDriver.mu.Unlock()\n\tfor i := len(hooks) - 1; i >= 0; i-- {\n\t\tfn = hooks[i](fn)\n\t}\n\treturn fn.Commit(tx.ctx, tx)\n}\n\n// OnCommit adds a hook to call on commit.\nfunc (tx *Tx) OnCommit(f CommitHook) {\n\ttxDriver := tx.config.driver.(*txDriver)\n\ttxDriver.mu.Lock()\n\ttxDriver.onCommit = append(txDriver.onCommit, f)\n\ttxDriver.mu.Unlock()\n}\n\ntype (\n\t// Rollbacker is the interface that wraps the Rollback method.\n\tRollbacker interface {\n\t\tRollback(context.Context, *Tx) error\n\t}\n\n\t// The RollbackFunc type is an adapter to allow the use of ordinary\n\t// function as a Rollbacker. If f is a function with the appropriate\n\t// signature, RollbackFunc(f) is a Rollbacker that calls f.\n\tRollbackFunc func(context.Context, *Tx) error\n\n\t// RollbackHook defines the \"rollback middleware\". A function that gets a Rollbacker\n\t// and returns a Rollbacker. For example:\n\t//\n\t//\thook := func(next ent.Rollbacker) ent.Rollbacker {\n\t//\t\treturn ent.RollbackFunc(func(ctx context.Context, tx *ent.Tx) error {\n\t//\t\t\t// Do some stuff before.\n\t//\t\t\tif err := next.Rollback(ctx, tx); err != nil {\n\t//\t\t\t\treturn err\n\t//\t\t\t}\n\t//\t\t\t// Do some stuff after.\n\t//\t\t\treturn nil\n\t//\t\t})\n\t//\t}\n\t//\n\tRollbackHook func(Rollbacker) Rollbacker\n)\n\n// Rollback calls f(ctx, m).\nfunc (f RollbackFunc) Rollback(ctx context.Context, tx *Tx) error {\n\treturn f(ctx, tx)\n}\n\n// Rollback rollbacks the transaction.\nfunc (tx *Tx) Rollback() error {\n\ttxDriver := tx.config.driver.(*txDriver)\n\tvar fn Rollbacker = RollbackFunc(func(context.Context, *Tx) error {\n\t\treturn txDriver.tx.Rollback()\n\t})\n\ttxDriver.mu.Lock()\n\thooks := append([]RollbackHook(nil), txDriver.onRollback...)\n\ttxDriver.mu.Unlock()\n\tfor i := len(hooks) - 1; i >= 0; i-- {\n\t\tfn = hooks[i](fn)\n\t}\n\treturn fn.Rollback(tx.ctx, tx)\n}\n\n// OnRollback adds a hook to call on rollback.\nfunc (tx *Tx) OnRollback(f RollbackHook) {\n\ttxDriver := tx.config.driver.(*txDriver)\n\ttxDriver.mu.Lock()\n\ttxDriver.onRollback = append(txDriver.onRollback, f)\n\ttxDriver.mu.Unlock()\n}\n\n// Client returns a Client that binds to current transaction.\nfunc (tx *Tx) Client() *Client {\n\ttx.clientOnce.Do(func() {\n\t\ttx.client = &Client{config: tx.config}\n\t\ttx.client.init()\n\t})\n\treturn tx.client\n}\n\nfunc (tx *Tx) init() {\n\ttx.Order = NewOrderClient(tx.config)\n}\n\n// txDriver wraps the given dialect.Tx with a nop dialect.Driver implementation.\n// The idea is to support transactions without adding any extra code to the builders.\n// When a builder calls to driver.Tx(), it gets the same dialect.Tx instance.\n// Commit and Rollback are nop for the internal builders and the user must call one\n// of them in order to commit or rollback the transaction.\n//\n// If a closed transaction is embedded in one of the generated entities, and the entity\n// applies a query, for example: Order.QueryXXX(), the query will be executed\n// through the driver which created this transaction.\n//\n// Note that txDriver is not goroutine safe.\ntype txDriver struct {\n\t// the driver we started the transaction from.\n\tdrv dialect.Driver\n\t// tx is the underlying transaction.\n\ttx dialect.Tx\n\t// completion hooks.\n\tmu         sync.Mutex\n\tonCommit   []CommitHook\n\tonRollback []RollbackHook\n}\n\n// newTx creates a new transactional driver.\nfunc newTx(ctx context.Context, drv dialect.Driver) (*txDriver, error) {\n\ttx, err := drv.Tx(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &txDriver{tx: tx, drv: drv}, nil\n}\n\n// Tx returns the transaction wrapper (txDriver) to avoid Commit or Rollback calls\n// from the internal builders. Should be called only by the internal builders.\nfunc (tx *txDriver) Tx(context.Context) (dialect.Tx, error) { return tx, nil }\n\n// Dialect returns the dialect of the driver we started the transaction from.\nfunc (tx *txDriver) Dialect() string { return tx.drv.Dialect() }\n\n// Close is a nop close.\nfunc (*txDriver) Close() error { return nil }\n\n// Commit is a nop commit for the internal builders.\n// User must call `Tx.Commit` in order to commit the transaction.\nfunc (*txDriver) Commit() error { return nil }\n\n// Rollback is a nop rollback for the internal builders.\n// User must call `Tx.Rollback` in order to rollback the transaction.\nfunc (*txDriver) Rollback() error { return nil }\n\n// Exec calls tx.Exec.\nfunc (tx *txDriver) Exec(ctx context.Context, query string, args, v any) error {\n\treturn tx.tx.Exec(ctx, query, args, v)\n}\n\n// Query calls tx.Query.\nfunc (tx *txDriver) Query(ctx context.Context, query string, args, v any) error {\n\treturn tx.tx.Query(ctx, query, args, v)\n}\n\nvar _ dialect.Driver = (*txDriver)(nil)\n"
  },
  {
    "path": "open-payment-platform/internal/payment/infrastructure/repository/order_sql.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage repository\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/entity\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/infrastructure/ent/order\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/usecase\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t_ \"github.com/go-sql-driver/mysql\"\n\t\"github.com/google/wire\"\n\t\"github.com/pkg/errors\"\n)\n\nconst (\n\t_dataBase = \"payment\"\n)\n\ntype OrderRepository struct {\n\tdb *ent.Client\n}\n\nvar SQLProviderSet = wire.NewSet(NewEntClient, NewOrderSQL)\n\nvar _ usecase.Repository = (*OrderRepository)(nil)\n\n// NewEntClient create an ent client with default config\nfunc NewEntClient() *ent.Client {\n\tentClient, err := ent.Open(\n\t\t\"mysql\",\n\t\tfmt.Sprintf(\"root:root@tcp(127.0.0.1:3306)/%s?parseTime=true\", _dataBase),\n\t)\n\tif err != nil {\n\t\tklog.Fatal(err)\n\t}\n\tif err = entClient.Schema.Create(context.TODO()); err != nil {\n\t\tklog.Fatalf(\"failed creating schema resources: %v\", err)\n\t}\n\treturn entClient\n}\n\n// GetByOutOrderNo implements usecase.Repository.GetByOutOrderNo\nfunc (o *OrderRepository) GetByOutOrderNo(ctx context.Context, outOrderNo string) (*entity.Order, error) {\n\tret, err := o.db.Order.Query().\n\t\tWhere(order.OutOrderNo(outOrderNo)).\n\t\tLimit(1).\n\t\tAll(ctx)\n\tif err != nil {\n\t\tklog.Error(err)\n\t\treturn nil, err\n\t}\n\tif len(ret) == 0 {\n\t\treturn nil, errors.New(\"OrdersNoFound\")\n\t}\n\trow := ret[0]\n\treturn &entity.Order{\n\t\tID:              row.ID,\n\t\tMerchantID:      row.MerchantID,\n\t\tChannel:         row.Channel,\n\t\tPayWay:          row.PayWay,\n\t\tOutOrderNo:      row.OutOrderNo,\n\t\tOrderStatus:     row.OrderStatus,\n\t\tTotalAmount:     row.TotalAmount,\n\t\tBody:            row.Body,\n\t\tAuthCode:        row.AuthCode,\n\t\tWxAppid:         row.WxAppid,\n\t\tSubOpenid:       row.SubOpenid,\n\t\tJumpURL:         row.JumpURL,\n\t\tNotifyURL:       row.NotifyURL,\n\t\tClientIP:        row.ClientIP,\n\t\tAttach:          row.Attach,\n\t\tOrderExpiration: row.OrderExpiration,\n\t\tExtendParams:    row.ExtendParams,\n\t}, nil\n}\n\n// Create implements usecase.Repository.Create\nfunc (o *OrderRepository) Create(ctx context.Context, order *entity.Order) error {\n\tret, err := o.db.Order.Create().\n\t\tSetMerchantID(order.MerchantID).\n\t\tSetPayWay(order.PayWay).\n\t\tSetTotalAmount(order.TotalAmount).\n\t\tSetBody(order.Body).\n\t\tSetAttach(order.Attach).\n\t\tSetChannel(order.Channel).\n\t\tSetClientIP(order.ClientIP).\n\t\tSetAuthCode(order.AuthCode).\n\t\tSetJumpURL(order.JumpURL).\n\t\tSetNotifyURL(order.NotifyURL).\n\t\tSetOrderExpiration(order.OrderExpiration).\n\t\tSetSubOpenid(order.SubOpenid).\n\t\tSetOutOrderNo(order.OutOrderNo).\n\t\tSetWxAppid(order.WxAppid).\n\t\tSetOrderStatus(order.OrderStatus).\n\t\tSetExtendParams(order.ExtendParams).\n\t\tSave(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\torder.ID = ret.ID\n\treturn nil\n}\n\n// UpdateOrderStatus implements usecase.Repository.UpdateOrderStatus\nfunc (o *OrderRepository) UpdateOrderStatus(ctx context.Context, outOrderNo string, orderStatus int8) error {\n\treturn o.db.Order.Update().Where(order.OutOrderNo(outOrderNo)).SetOrderStatus(orderStatus).Exec(ctx)\n}\n\n// NewOrderSQL creates a new OrderRepository.\n// This is the concrete implementation of Repository with SQL.\nfunc NewOrderSQL(dbClient *ent.Client) usecase.Repository {\n\treturn &OrderRepository{\n\t\tdb: dbClient,\n\t}\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/usecase/interface.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage usecase\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/entity\"\n)\n\n// Repository is the interface of usecase dependent on.\n// the interface is the part of usecase logic,so we put it here.\ntype Repository interface {\n\tGetByOutOrderNo(ctx context.Context, outOrderNo string) (*entity.Order, error)\n\tUpdateOrderStatus(ctx context.Context, outOrderNo string, orderStatus int8) error\n\tCreate(ctx context.Context, order *entity.Order) error\n}\n"
  },
  {
    "path": "open-payment-platform/internal/payment/usecase/service.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage usecase\n\nimport (\n\t\"context\"\n\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/internal/payment/entity\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/common\"\n\t\"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/payment\"\n\t\"github.com/cloudwego/kitex/pkg/kerrors\"\n\t\"github.com/cloudwego/kitex/pkg/klog\"\n\t\"github.com/google/wire\"\n)\n\nvar ProviderSet = wire.NewSet(NewService)\n\nvar _ payment.PaymentSvc = (*Service)(nil)\n\ntype Service struct {\n\trepo Repository\n}\n\n// UnifyPay implements payment.PaymentSvc.UnifyPay\nfunc (s *Service) UnifyPay(ctx context.Context, req *payment.UnifyPayReq) (r *payment.UnifyPayResp, err error) {\n\to := entity.NewOrder()\n\to.PayWay = req.PayWay\n\to.SubOpenid = req.SubOpenId\n\to.MerchantID = req.MerchantId\n\to.OutOrderNo = req.OutOrderNo\n\to.Channel = \"1\"\n\n\terr = s.repo.Create(ctx, o)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &payment.UnifyPayResp{\n\t\tMerchantId:    o.MerchantID,\n\t\tSubMerchantId: o.SubOpenid,\n\t\tOutOrderNo:    o.OutOrderNo,\n\t\tJspayInfo:     \"xxxxx\",\n\t\tPayWay:        o.PayWay,\n\t}, nil\n}\n\nfunc (s *Service) uniqueOutOrderNo(ctx context.Context, outOrderNo string) (bool, error) {\n\treturn true, nil\n}\n\n// QRPay implements payment.PaymentSvc.QRPay\nfunc (s *Service) QRPay(ctx context.Context, req *payment.QRPayReq) (r *payment.QRPayResp, err error) {\n\tonlyOne, err := s.uniqueOutOrderNo(ctx, req.OutOrderNo)\n\tif err != nil {\n\t\tklog.CtxErrorf(ctx, \"err:%v\", err)\n\t\treturn nil, err\n\t}\n\tif !onlyOne {\n\t\treturn nil, kerrors.NewBizStatusError(int32(common.Err_DuplicateOutOrderNo), common.Err_DuplicateOutOrderNo.String())\n\t}\n\to := entity.NewOrder()\n\to.PayWay = req.OutOrderNo\n\to.TotalAmount = uint64(req.TotalAmount)\n\to.MerchantID = req.MerchantId\n\to.OutOrderNo = req.OutOrderNo\n\to.Channel = \"1\"\n\n\terr = s.repo.Create(ctx, o)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &payment.QRPayResp{\n\t\tMerchantId:    o.MerchantID,\n\t\tSubMerchantId: o.SubOpenid,\n\t\tOutOrderNo:    o.OutOrderNo,\n\t\tPayWay:        o.PayWay,\n\t}, nil\n}\n\n// QueryOrder implements payment.PaymentSvc.QueryOrder\nfunc (s *Service) QueryOrder(ctx context.Context, req *payment.QueryOrderReq) (r *payment.QueryOrderResp, err error) {\n\torder, err := s.repo.GetByOutOrderNo(ctx, req.OutOrderNo)\n\tif err != nil {\n\t\tklog.Error(err)\n\t\treturn nil, err\n\t}\n\treturn &payment.QueryOrderResp{\n\t\tOrderStatus: order.OrderStatus,\n\t}, nil\n}\n\n// CloseOrder implements payment.PaymentSvc.CloseOrder\nfunc (s *Service) CloseOrder(ctx context.Context, req *payment.CloseOrderReq) (r *payment.CloseOrderResp, err error) {\n\tif err = s.repo.UpdateOrderStatus(ctx, req.OutOrderNo, 9); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &payment.CloseOrderResp{}, nil\n}\n\n// NewService create new service\nfunc NewService(r Repository) payment.PaymentSvc {\n\treturn &Service{\n\t\trepo: r,\n\t}\n}\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/common/common.go",
    "content": "// Code generated by thriftgo (0.1.3). DO NOT EDIT.\n\npackage common\n\nimport (\n\t\"database/sql\"\n\t\"database/sql/driver\"\n\t\"fmt\"\n)\n\ntype Err int64\n\nconst (\n\tErr_BadRequest           Err = 10001\n\tErr_Unauthorized         Err = 10002\n\tErr_ServerNotFound       Err = 10003\n\tErr_ServerMethodNotFound Err = 10004\n\tErr_RequestServerFail    Err = 10005\n\tErr_ServerHandleFail     Err = 10006\n\tErr_ResponseUnableParse  Err = 10007\n\tErr_DuplicateOutOrderNo  Err = 20001\n)\n\nfunc (p Err) String() string {\n\tswitch p {\n\tcase Err_BadRequest:\n\t\treturn \"BadRequest\"\n\tcase Err_Unauthorized:\n\t\treturn \"Unauthorized\"\n\tcase Err_ServerNotFound:\n\t\treturn \"ServerNotFound\"\n\tcase Err_ServerMethodNotFound:\n\t\treturn \"ServerMethodNotFound\"\n\tcase Err_RequestServerFail:\n\t\treturn \"RequestServerFail\"\n\tcase Err_ServerHandleFail:\n\t\treturn \"ServerHandleFail\"\n\tcase Err_ResponseUnableParse:\n\t\treturn \"ResponseUnableParse\"\n\tcase Err_DuplicateOutOrderNo:\n\t\treturn \"DuplicateOutOrderNo\"\n\t}\n\treturn \"<UNSET>\"\n}\n\nfunc ErrFromString(s string) (Err, error) {\n\tswitch s {\n\tcase \"BadRequest\":\n\t\treturn Err_BadRequest, nil\n\tcase \"Unauthorized\":\n\t\treturn Err_Unauthorized, nil\n\tcase \"ServerNotFound\":\n\t\treturn Err_ServerNotFound, nil\n\tcase \"ServerMethodNotFound\":\n\t\treturn Err_ServerMethodNotFound, nil\n\tcase \"RequestServerFail\":\n\t\treturn Err_RequestServerFail, nil\n\tcase \"ServerHandleFail\":\n\t\treturn Err_ServerHandleFail, nil\n\tcase \"ResponseUnableParse\":\n\t\treturn Err_ResponseUnableParse, nil\n\tcase \"DuplicateOutOrderNo\":\n\t\treturn Err_DuplicateOutOrderNo, nil\n\t}\n\treturn Err(0), fmt.Errorf(\"not a valid Err string\")\n}\n\nfunc ErrPtr(v Err) *Err { return &v }\n\nfunc (p *Err) Scan(value interface{}) (err error) {\n\tvar result sql.NullInt64\n\terr = result.Scan(value)\n\t*p = Err(result.Int64)\n\treturn\n}\n\nfunc (p *Err) Value() (driver.Value, error) {\n\tif p == nil {\n\t\treturn nil, nil\n\t}\n\treturn int64(*p), nil\n}\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/common/k-common.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage common\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/common/k-consts.go",
    "content": "package common\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/payment/k-consts.go",
    "content": "package payment\n\n// KitexUnusedProtection is used to prevent 'imported and not used' error.\nvar KitexUnusedProtection = struct{}{}\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/payment/k-payment.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage payment\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n\n\t\"github.com/cloudwego/kitex/pkg/protocol/bthrift\"\n)\n\n// unused protection\nvar (\n\t_ = fmt.Formatter(nil)\n\t_ = (*bytes.Buffer)(nil)\n\t_ = (*strings.Builder)(nil)\n\t_ = reflect.Type(nil)\n\t_ = thrift.TProtocol(nil)\n\t_ = bthrift.BinaryWriter(nil)\n)\n\nfunc (p *UnifyPayReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField6(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField7(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 8:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField8(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 9:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField9(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 10:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tl, err = p.FastReadField10(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UnifyPayReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OutOrderNo = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.TotalAmount = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayReq) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Subject = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayReq) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.MerchantId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayReq) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.PayWay = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayReq) FastReadField6(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.AppId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayReq) FastReadField7(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.SubOpenId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayReq) FastReadField8(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.NotifyUrl = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayReq) FastReadField9(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ClientIp = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayReq) FastReadField10(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI32(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OrderExpiration = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UnifyPayReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UnifyPayReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"UnifyPayReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField10(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField6(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField7(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField8(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField9(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"UnifyPayReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t\tl += p.field6Length()\n\t\tl += p.field7Length()\n\t\tl += p.field8Length()\n\t\tl += p.field9Length()\n\t\tl += p.field10Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"out_order_no\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.OutOrderNo)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"total_amount\", thrift.I64, 2)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.TotalAmount)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"subject\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Subject)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"merchant_id\", thrift.STRING, 4)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.MerchantId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"pay_way\", thrift.STRING, 5)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.PayWay)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) fastWriteField6(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"app_id\", thrift.STRING, 6)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.AppId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) fastWriteField7(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"sub_open_id\", thrift.STRING, 7)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.SubOpenId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) fastWriteField8(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"notify_url\", thrift.STRING, 8)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.NotifyUrl)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) fastWriteField9(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"client_ip\", thrift.STRING, 9)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.ClientIp)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) fastWriteField10(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"order_expiration\", thrift.I32, 10)\n\toffset += bthrift.Binary.WriteI32(buf[offset:], p.OrderExpiration)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"out_order_no\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.OutOrderNo)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"total_amount\", thrift.I64, 2)\n\tl += bthrift.Binary.I64Length(p.TotalAmount)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"subject\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.Subject)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"merchant_id\", thrift.STRING, 4)\n\tl += bthrift.Binary.StringLengthNocopy(p.MerchantId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) field5Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"pay_way\", thrift.STRING, 5)\n\tl += bthrift.Binary.StringLengthNocopy(p.PayWay)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) field6Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"app_id\", thrift.STRING, 6)\n\tl += bthrift.Binary.StringLengthNocopy(p.AppId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) field7Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"sub_open_id\", thrift.STRING, 7)\n\tl += bthrift.Binary.StringLengthNocopy(p.SubOpenId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) field8Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"notify_url\", thrift.STRING, 8)\n\tl += bthrift.Binary.StringLengthNocopy(p.NotifyUrl)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) field9Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"client_ip\", thrift.STRING, 9)\n\tl += bthrift.Binary.StringLengthNocopy(p.ClientIp)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayReq) field10Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"order_expiration\", thrift.I32, 10)\n\tl += bthrift.Binary.I32Length(p.OrderExpiration)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UnifyPayResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UnifyPayResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.MerchantId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayResp) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.SubMerchantId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayResp) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OutOrderNo = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayResp) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.JspayInfo = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *UnifyPayResp) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.PayWay = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *UnifyPayResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *UnifyPayResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"UnifyPayResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"UnifyPayResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"merchant_id\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.MerchantId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayResp) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"sub_merchant_id\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.SubMerchantId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayResp) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"out_order_no\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.OutOrderNo)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayResp) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"jspay_info\", thrift.STRING, 4)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.JspayInfo)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayResp) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"pay_way\", thrift.STRING, 5)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.PayWay)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *UnifyPayResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"merchant_id\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.MerchantId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayResp) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"sub_merchant_id\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.SubMerchantId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayResp) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"out_order_no\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.OutOrderNo)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayResp) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"jspay_info\", thrift.STRING, 4)\n\tl += bthrift.Binary.StringLengthNocopy(p.JspayInfo)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *UnifyPayResp) field5Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"pay_way\", thrift.STRING, 5)\n\tl += bthrift.Binary.StringLengthNocopy(p.PayWay)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField6(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField7(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QRPayReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QRPayReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OutOrderNo = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayReq) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadI64(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.TotalAmount = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayReq) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.Subject = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayReq) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.MerchantId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayReq) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.AuthCode = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayReq) FastReadField6(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.NotifyUrl = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayReq) FastReadField7(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.ClientIp = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *QRPayReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *QRPayReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QRPayReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField6(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField7(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QRPayReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t\tl += p.field6Length()\n\t\tl += p.field7Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *QRPayReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"out_order_no\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.OutOrderNo)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayReq) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"total_amount\", thrift.I64, 2)\n\toffset += bthrift.Binary.WriteI64(buf[offset:], p.TotalAmount)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayReq) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"subject\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.Subject)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayReq) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"merchant_id\", thrift.STRING, 4)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.MerchantId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayReq) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"auth_code\", thrift.STRING, 5)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.AuthCode)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayReq) fastWriteField6(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"notify_url\", thrift.STRING, 6)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.NotifyUrl)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayReq) fastWriteField7(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"client_ip\", thrift.STRING, 7)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.ClientIp)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"out_order_no\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.OutOrderNo)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayReq) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"total_amount\", thrift.I64, 2)\n\tl += bthrift.Binary.I64Length(p.TotalAmount)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayReq) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"subject\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.Subject)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayReq) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"merchant_id\", thrift.STRING, 4)\n\tl += bthrift.Binary.StringLengthNocopy(p.MerchantId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayReq) field5Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"auth_code\", thrift.STRING, 5)\n\tl += bthrift.Binary.StringLengthNocopy(p.AuthCode)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayReq) field6Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"notify_url\", thrift.STRING, 6)\n\tl += bthrift.Binary.StringLengthNocopy(p.NotifyUrl)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayReq) field7Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"client_ip\", thrift.STRING, 7)\n\tl += bthrift.Binary.StringLengthNocopy(p.ClientIp)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField2(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField3(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tl, err = p.FastReadField4(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField5(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField6(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField7(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 8:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField8(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QRPayResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QRPayResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.MerchantId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayResp) FastReadField2(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.SubMerchantId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayResp) FastReadField3(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OutOrderNo = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayResp) FastReadField4(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadByte(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OrderStatus = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayResp) FastReadField5(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.PayWay = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayResp) FastReadField6(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OpenId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayResp) FastReadField7(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OutTransactionId = v\n\n\t}\n\treturn offset, nil\n}\n\nfunc (p *QRPayResp) FastReadField8(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.SubOpenid = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *QRPayResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *QRPayResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QRPayResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField4(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField2(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField3(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField5(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField6(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField7(buf[offset:], binaryWriter)\n\t\toffset += p.fastWriteField8(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QRPayResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t\tl += p.field2Length()\n\t\tl += p.field3Length()\n\t\tl += p.field4Length()\n\t\tl += p.field5Length()\n\t\tl += p.field6Length()\n\t\tl += p.field7Length()\n\t\tl += p.field8Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *QRPayResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"merchant_id\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.MerchantId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayResp) fastWriteField2(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"sub_merchant_id\", thrift.STRING, 2)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.SubMerchantId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayResp) fastWriteField3(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"out_order_no\", thrift.STRING, 3)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.OutOrderNo)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayResp) fastWriteField4(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"order_status\", thrift.BYTE, 4)\n\toffset += bthrift.Binary.WriteByte(buf[offset:], p.OrderStatus)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayResp) fastWriteField5(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"pay_way\", thrift.STRING, 5)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.PayWay)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayResp) fastWriteField6(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"open_id\", thrift.STRING, 6)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.OpenId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayResp) fastWriteField7(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"out_transaction_id\", thrift.STRING, 7)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.OutTransactionId)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayResp) fastWriteField8(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"sub_openid\", thrift.STRING, 8)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.SubOpenid)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QRPayResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"merchant_id\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.MerchantId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayResp) field2Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"sub_merchant_id\", thrift.STRING, 2)\n\tl += bthrift.Binary.StringLengthNocopy(p.SubMerchantId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayResp) field3Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"out_order_no\", thrift.STRING, 3)\n\tl += bthrift.Binary.StringLengthNocopy(p.OutOrderNo)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayResp) field4Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"order_status\", thrift.BYTE, 4)\n\tl += bthrift.Binary.ByteLength(p.OrderStatus)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayResp) field5Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"pay_way\", thrift.STRING, 5)\n\tl += bthrift.Binary.StringLengthNocopy(p.PayWay)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayResp) field6Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"open_id\", thrift.STRING, 6)\n\tl += bthrift.Binary.StringLengthNocopy(p.OpenId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayResp) field7Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"out_transaction_id\", thrift.STRING, 7)\n\tl += bthrift.Binary.StringLengthNocopy(p.OutTransactionId)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QRPayResp) field8Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"sub_openid\", thrift.STRING, 8)\n\tl += bthrift.Binary.StringLengthNocopy(p.SubOpenid)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QueryOrderReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryOrderReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OutOrderNo = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *QueryOrderReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *QueryOrderReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QueryOrderReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryOrderReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QueryOrderReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *QueryOrderReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"out_order_no\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.OutOrderNo)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryOrderReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"out_order_no\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.OutOrderNo)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *QueryOrderResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryOrderResp[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryOrderResp) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadByte(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OrderStatus = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *QueryOrderResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *QueryOrderResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QueryOrderResp\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryOrderResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QueryOrderResp\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *QueryOrderResp) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"order_status\", thrift.BYTE, 1)\n\toffset += bthrift.Binary.WriteByte(buf[offset:], p.OrderStatus)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *QueryOrderResp) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"order_status\", thrift.BYTE, 1)\n\tl += bthrift.Binary.ByteLength(p.OrderStatus)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CloseOrderReq) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CloseOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CloseOrderReq) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\tif v, l, err := bthrift.Binary.ReadString(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\n\t\tp.OutOrderNo = v\n\n\t}\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *CloseOrderReq) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CloseOrderReq) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CloseOrderReq\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CloseOrderReq) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CloseOrderReq\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *CloseOrderReq) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"out_order_no\", thrift.STRING, 1)\n\toffset += bthrift.Binary.WriteStringNocopy(buf[offset:], binaryWriter, p.OutOrderNo)\n\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CloseOrderReq) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"out_order_no\", thrift.STRING, 1)\n\tl += bthrift.Binary.StringLengthNocopy(p.OutOrderNo)\n\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *CloseOrderResp) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto SkipFieldTypeError\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\n\nSkipFieldTypeError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T skip field type %d error\", p, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\n// for compatibility\nfunc (p *CloseOrderResp) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *CloseOrderResp) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CloseOrderResp\")\n\tif p != nil {\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *CloseOrderResp) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CloseOrderResp\")\n\tif p != nil {\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcUnifyPayArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewUnifyPayReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *PaymentSvcUnifyPayArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"UnifyPay_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"UnifyPay_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcUnifyPayResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcUnifyPayResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcUnifyPayResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewUnifyPayResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *PaymentSvcUnifyPayResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *PaymentSvcUnifyPayResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"UnifyPay_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcUnifyPayResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"UnifyPay_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcUnifyPayResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *PaymentSvcUnifyPayResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *PaymentSvcQRPayArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcQRPayArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQRPayArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewQRPayReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *PaymentSvcQRPayArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *PaymentSvcQRPayArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QRPay_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcQRPayArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QRPay_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcQRPayArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcQRPayArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcQRPayResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcQRPayResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQRPayResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewQRPayResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *PaymentSvcQRPayResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *PaymentSvcQRPayResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QRPay_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcQRPayResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QRPay_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcQRPayResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *PaymentSvcQRPayResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcQueryOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewQueryOrderReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *PaymentSvcQueryOrderArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QueryOrder_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QueryOrder_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcQueryOrderResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcQueryOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQueryOrderResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewQueryOrderResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *PaymentSvcQueryOrderResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *PaymentSvcQueryOrderResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"QueryOrder_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcQueryOrderResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"QueryOrder_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcQueryOrderResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *PaymentSvcQueryOrderResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField1(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcCloseOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) FastReadField1(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCloseOrderReq()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Req = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *PaymentSvcCloseOrderArgs) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CloseOrder_args\")\n\tif p != nil {\n\t\toffset += p.fastWriteField1(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CloseOrder_args\")\n\tif p != nil {\n\t\tl += p.field1Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) fastWriteField1(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"req\", thrift.STRUCT, 1)\n\toffset += p.Req.FastWriteNocopy(buf[offset:], binaryWriter)\n\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) field1Length() int {\n\tl := 0\n\tl += bthrift.Binary.FieldBeginLength(\"req\", thrift.STRUCT, 1)\n\tl += p.Req.BLength()\n\tl += bthrift.Binary.FieldEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcCloseOrderResult) FastRead(buf []byte) (int, error) {\n\tvar err error\n\tvar offset int\n\tvar l int\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\t_, l, err = bthrift.Binary.ReadStructBegin(buf)\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, l, err = bthrift.Binary.ReadFieldBegin(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tl, err = p.FastReadField0(buf[offset:])\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\t\toffset += l\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tl, err = bthrift.Binary.Skip(buf[offset:], fieldTypeId)\n\t\t\toffset += l\n\t\t\tif err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tl, err = bthrift.Binary.ReadFieldEnd(buf[offset:])\n\t\toffset += l\n\t\tif err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tl, err = bthrift.Binary.ReadStructEnd(buf[offset:])\n\toffset += l\n\tif err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn offset, nil\nReadStructBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcCloseOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\nReadFieldEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn offset, thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcCloseOrderResult) FastReadField0(buf []byte) (int, error) {\n\toffset := 0\n\n\ttmp := NewCloseOrderResp()\n\tif l, err := tmp.FastRead(buf[offset:]); err != nil {\n\t\treturn offset, err\n\t} else {\n\t\toffset += l\n\t}\n\tp.Success = tmp\n\treturn offset, nil\n}\n\n// for compatibility\nfunc (p *PaymentSvcCloseOrderResult) FastWrite(buf []byte) int {\n\treturn 0\n}\n\nfunc (p *PaymentSvcCloseOrderResult) FastWriteNocopy(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\toffset += bthrift.Binary.WriteStructBegin(buf[offset:], \"CloseOrder_result\")\n\tif p != nil {\n\t\toffset += p.fastWriteField0(buf[offset:], binaryWriter)\n\t}\n\toffset += bthrift.Binary.WriteFieldStop(buf[offset:])\n\toffset += bthrift.Binary.WriteStructEnd(buf[offset:])\n\treturn offset\n}\n\nfunc (p *PaymentSvcCloseOrderResult) BLength() int {\n\tl := 0\n\tl += bthrift.Binary.StructBeginLength(\"CloseOrder_result\")\n\tif p != nil {\n\t\tl += p.field0Length()\n\t}\n\tl += bthrift.Binary.FieldStopLength()\n\tl += bthrift.Binary.StructEndLength()\n\treturn l\n}\n\nfunc (p *PaymentSvcCloseOrderResult) fastWriteField0(buf []byte, binaryWriter bthrift.BinaryWriter) int {\n\toffset := 0\n\tif p.IsSetSuccess() {\n\t\toffset += bthrift.Binary.WriteFieldBegin(buf[offset:], \"success\", thrift.STRUCT, 0)\n\t\toffset += p.Success.FastWriteNocopy(buf[offset:], binaryWriter)\n\t\toffset += bthrift.Binary.WriteFieldEnd(buf[offset:])\n\t}\n\treturn offset\n}\n\nfunc (p *PaymentSvcCloseOrderResult) field0Length() int {\n\tl := 0\n\tif p.IsSetSuccess() {\n\t\tl += bthrift.Binary.FieldBeginLength(\"success\", thrift.STRUCT, 0)\n\t\tl += p.Success.BLength()\n\t\tl += bthrift.Binary.FieldEndLength()\n\t}\n\treturn l\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *PaymentSvcUnifyPayResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *PaymentSvcQRPayArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *PaymentSvcQRPayResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *PaymentSvcQueryOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) GetFirstArgument() interface{} {\n\treturn p.Req\n}\n\nfunc (p *PaymentSvcCloseOrderResult) GetResult() interface{} {\n\treturn p.Success\n}\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/payment/payment.go",
    "content": "// Code generated by thriftgo (0.1.3). DO NOT EDIT.\n\npackage payment\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/apache/thrift/lib/go/thrift\"\n)\n\ntype UnifyPayReq struct {\n\tOutOrderNo      string `thrift:\"out_order_no,1\" json:\"out_order_no\"`\n\tTotalAmount     int64  `thrift:\"total_amount,2\" json:\"total_amount\"`\n\tSubject         string `thrift:\"subject,3\" json:\"subject\"`\n\tMerchantId      string `thrift:\"merchant_id,4\" json:\"merchant_id\"`\n\tPayWay          string `thrift:\"pay_way,5\" json:\"pay_way\"`\n\tAppId           string `thrift:\"app_id,6\" json:\"app_id\"`\n\tSubOpenId       string `thrift:\"sub_open_id,7\" json:\"sub_open_id\"`\n\tNotifyUrl       string `thrift:\"notify_url,8\" json:\"notify_url\"`\n\tClientIp        string `thrift:\"client_ip,9\" json:\"client_ip\"`\n\tOrderExpiration int32  `thrift:\"order_expiration,10\" json:\"order_expiration\"`\n}\n\nfunc NewUnifyPayReq() *UnifyPayReq {\n\treturn &UnifyPayReq{}\n}\n\nfunc (p *UnifyPayReq) GetOutOrderNo() (v string) {\n\treturn p.OutOrderNo\n}\n\nfunc (p *UnifyPayReq) GetTotalAmount() (v int64) {\n\treturn p.TotalAmount\n}\n\nfunc (p *UnifyPayReq) GetSubject() (v string) {\n\treturn p.Subject\n}\n\nfunc (p *UnifyPayReq) GetMerchantId() (v string) {\n\treturn p.MerchantId\n}\n\nfunc (p *UnifyPayReq) GetPayWay() (v string) {\n\treturn p.PayWay\n}\n\nfunc (p *UnifyPayReq) GetAppId() (v string) {\n\treturn p.AppId\n}\n\nfunc (p *UnifyPayReq) GetSubOpenId() (v string) {\n\treturn p.SubOpenId\n}\n\nfunc (p *UnifyPayReq) GetNotifyUrl() (v string) {\n\treturn p.NotifyUrl\n}\n\nfunc (p *UnifyPayReq) GetClientIp() (v string) {\n\treturn p.ClientIp\n}\n\nfunc (p *UnifyPayReq) GetOrderExpiration() (v int32) {\n\treturn p.OrderExpiration\n}\nfunc (p *UnifyPayReq) SetOutOrderNo(val string) {\n\tp.OutOrderNo = val\n}\nfunc (p *UnifyPayReq) SetTotalAmount(val int64) {\n\tp.TotalAmount = val\n}\nfunc (p *UnifyPayReq) SetSubject(val string) {\n\tp.Subject = val\n}\nfunc (p *UnifyPayReq) SetMerchantId(val string) {\n\tp.MerchantId = val\n}\nfunc (p *UnifyPayReq) SetPayWay(val string) {\n\tp.PayWay = val\n}\nfunc (p *UnifyPayReq) SetAppId(val string) {\n\tp.AppId = val\n}\nfunc (p *UnifyPayReq) SetSubOpenId(val string) {\n\tp.SubOpenId = val\n}\nfunc (p *UnifyPayReq) SetNotifyUrl(val string) {\n\tp.NotifyUrl = val\n}\nfunc (p *UnifyPayReq) SetClientIp(val string) {\n\tp.ClientIp = val\n}\nfunc (p *UnifyPayReq) SetOrderExpiration(val int32) {\n\tp.OrderExpiration = val\n}\n\nvar fieldIDToName_UnifyPayReq = map[int16]string{\n\t1:  \"out_order_no\",\n\t2:  \"total_amount\",\n\t3:  \"subject\",\n\t4:  \"merchant_id\",\n\t5:  \"pay_way\",\n\t6:  \"app_id\",\n\t7:  \"sub_open_id\",\n\t8:  \"notify_url\",\n\t9:  \"client_ip\",\n\t10: \"order_expiration\",\n}\n\nfunc (p *UnifyPayReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField6(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField7(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 8:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField8(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 9:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField9(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 10:\n\t\t\tif fieldTypeId == thrift.I32 {\n\t\t\t\tif err = p.ReadField10(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UnifyPayReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OutOrderNo = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.TotalAmount = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Subject = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.MerchantId = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) ReadField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.PayWay = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) ReadField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.AppId = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) ReadField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SubOpenId = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) ReadField8(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.NotifyUrl = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) ReadField9(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ClientIp = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) ReadField10(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OrderExpiration = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UnifyPayReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField6(oprot); err != nil {\n\t\t\tfieldId = 6\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField7(oprot); err != nil {\n\t\t\tfieldId = 7\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField8(oprot); err != nil {\n\t\t\tfieldId = 8\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField9(oprot); err != nil {\n\t\t\tfieldId = 9\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField10(oprot); err != nil {\n\t\t\tfieldId = 10\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"out_order_no\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.OutOrderNo); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"total_amount\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.TotalAmount); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"subject\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Subject); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"merchant_id\", thrift.STRING, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.MerchantId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"pay_way\", thrift.STRING, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.PayWay); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField6(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"app_id\", thrift.STRING, 6); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.AppId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField7(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"sub_open_id\", thrift.STRING, 7); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.SubOpenId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField8(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"notify_url\", thrift.STRING, 8); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.NotifyUrl); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 8 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 8 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField9(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"client_ip\", thrift.STRING, 9); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.ClientIp); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 9 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 9 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) writeField10(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"order_expiration\", thrift.I32, 10); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI32(p.OrderExpiration); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 10 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 10 end error: \", p), err)\n}\n\nfunc (p *UnifyPayReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UnifyPayReq(%+v)\", *p)\n}\n\nfunc (p *UnifyPayReq) DeepEqual(ano *UnifyPayReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.OutOrderNo) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.TotalAmount) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Subject) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.MerchantId) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.PayWay) {\n\t\treturn false\n\t}\n\tif !p.Field6DeepEqual(ano.AppId) {\n\t\treturn false\n\t}\n\tif !p.Field7DeepEqual(ano.SubOpenId) {\n\t\treturn false\n\t}\n\tif !p.Field8DeepEqual(ano.NotifyUrl) {\n\t\treturn false\n\t}\n\tif !p.Field9DeepEqual(ano.ClientIp) {\n\t\treturn false\n\t}\n\tif !p.Field10DeepEqual(ano.OrderExpiration) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UnifyPayReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.OutOrderNo, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayReq) Field2DeepEqual(src int64) bool {\n\n\tif p.TotalAmount != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayReq) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Subject, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayReq) Field4DeepEqual(src string) bool {\n\n\tif strings.Compare(p.MerchantId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayReq) Field5DeepEqual(src string) bool {\n\n\tif strings.Compare(p.PayWay, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayReq) Field6DeepEqual(src string) bool {\n\n\tif strings.Compare(p.AppId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayReq) Field7DeepEqual(src string) bool {\n\n\tif strings.Compare(p.SubOpenId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayReq) Field8DeepEqual(src string) bool {\n\n\tif strings.Compare(p.NotifyUrl, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayReq) Field9DeepEqual(src string) bool {\n\n\tif strings.Compare(p.ClientIp, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayReq) Field10DeepEqual(src int32) bool {\n\n\tif p.OrderExpiration != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype UnifyPayResp struct {\n\tMerchantId    string `thrift:\"merchant_id,1\" json:\"merchant_id\"`\n\tSubMerchantId string `thrift:\"sub_merchant_id,2\" json:\"sub_merchant_id\"`\n\tOutOrderNo    string `thrift:\"out_order_no,3\" json:\"out_order_no\"`\n\tJspayInfo     string `thrift:\"jspay_info,4\" json:\"jspay_info\"`\n\tPayWay        string `thrift:\"pay_way,5\" json:\"pay_way\"`\n}\n\nfunc NewUnifyPayResp() *UnifyPayResp {\n\treturn &UnifyPayResp{}\n}\n\nfunc (p *UnifyPayResp) GetMerchantId() (v string) {\n\treturn p.MerchantId\n}\n\nfunc (p *UnifyPayResp) GetSubMerchantId() (v string) {\n\treturn p.SubMerchantId\n}\n\nfunc (p *UnifyPayResp) GetOutOrderNo() (v string) {\n\treturn p.OutOrderNo\n}\n\nfunc (p *UnifyPayResp) GetJspayInfo() (v string) {\n\treturn p.JspayInfo\n}\n\nfunc (p *UnifyPayResp) GetPayWay() (v string) {\n\treturn p.PayWay\n}\nfunc (p *UnifyPayResp) SetMerchantId(val string) {\n\tp.MerchantId = val\n}\nfunc (p *UnifyPayResp) SetSubMerchantId(val string) {\n\tp.SubMerchantId = val\n}\nfunc (p *UnifyPayResp) SetOutOrderNo(val string) {\n\tp.OutOrderNo = val\n}\nfunc (p *UnifyPayResp) SetJspayInfo(val string) {\n\tp.JspayInfo = val\n}\nfunc (p *UnifyPayResp) SetPayWay(val string) {\n\tp.PayWay = val\n}\n\nvar fieldIDToName_UnifyPayResp = map[int16]string{\n\t1: \"merchant_id\",\n\t2: \"sub_merchant_id\",\n\t3: \"out_order_no\",\n\t4: \"jspay_info\",\n\t5: \"pay_way\",\n}\n\nfunc (p *UnifyPayResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_UnifyPayResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *UnifyPayResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.MerchantId = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayResp) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SubMerchantId = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayResp) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OutOrderNo = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayResp) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.JspayInfo = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayResp) ReadField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.PayWay = v\n\t}\n\treturn nil\n}\n\nfunc (p *UnifyPayResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UnifyPayResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *UnifyPayResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"merchant_id\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.MerchantId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *UnifyPayResp) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"sub_merchant_id\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.SubMerchantId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *UnifyPayResp) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"out_order_no\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.OutOrderNo); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *UnifyPayResp) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"jspay_info\", thrift.STRING, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.JspayInfo); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *UnifyPayResp) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"pay_way\", thrift.STRING, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.PayWay); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *UnifyPayResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"UnifyPayResp(%+v)\", *p)\n}\n\nfunc (p *UnifyPayResp) DeepEqual(ano *UnifyPayResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.MerchantId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.SubMerchantId) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.OutOrderNo) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.JspayInfo) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.PayWay) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *UnifyPayResp) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.MerchantId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayResp) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.SubMerchantId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayResp) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.OutOrderNo, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayResp) Field4DeepEqual(src string) bool {\n\n\tif strings.Compare(p.JspayInfo, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *UnifyPayResp) Field5DeepEqual(src string) bool {\n\n\tif strings.Compare(p.PayWay, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype QRPayReq struct {\n\tOutOrderNo  string `thrift:\"out_order_no,1\" json:\"out_order_no\"`\n\tTotalAmount int64  `thrift:\"total_amount,2\" json:\"total_amount\"`\n\tSubject     string `thrift:\"subject,3\" json:\"subject\"`\n\tMerchantId  string `thrift:\"merchant_id,4\" json:\"merchant_id\"`\n\tAuthCode    string `thrift:\"auth_code,5\" json:\"auth_code\"`\n\tNotifyUrl   string `thrift:\"notify_url,6\" json:\"notify_url\"`\n\tClientIp    string `thrift:\"client_ip,7\" json:\"client_ip\"`\n}\n\nfunc NewQRPayReq() *QRPayReq {\n\treturn &QRPayReq{}\n}\n\nfunc (p *QRPayReq) GetOutOrderNo() (v string) {\n\treturn p.OutOrderNo\n}\n\nfunc (p *QRPayReq) GetTotalAmount() (v int64) {\n\treturn p.TotalAmount\n}\n\nfunc (p *QRPayReq) GetSubject() (v string) {\n\treturn p.Subject\n}\n\nfunc (p *QRPayReq) GetMerchantId() (v string) {\n\treturn p.MerchantId\n}\n\nfunc (p *QRPayReq) GetAuthCode() (v string) {\n\treturn p.AuthCode\n}\n\nfunc (p *QRPayReq) GetNotifyUrl() (v string) {\n\treturn p.NotifyUrl\n}\n\nfunc (p *QRPayReq) GetClientIp() (v string) {\n\treturn p.ClientIp\n}\nfunc (p *QRPayReq) SetOutOrderNo(val string) {\n\tp.OutOrderNo = val\n}\nfunc (p *QRPayReq) SetTotalAmount(val int64) {\n\tp.TotalAmount = val\n}\nfunc (p *QRPayReq) SetSubject(val string) {\n\tp.Subject = val\n}\nfunc (p *QRPayReq) SetMerchantId(val string) {\n\tp.MerchantId = val\n}\nfunc (p *QRPayReq) SetAuthCode(val string) {\n\tp.AuthCode = val\n}\nfunc (p *QRPayReq) SetNotifyUrl(val string) {\n\tp.NotifyUrl = val\n}\nfunc (p *QRPayReq) SetClientIp(val string) {\n\tp.ClientIp = val\n}\n\nvar fieldIDToName_QRPayReq = map[int16]string{\n\t1: \"out_order_no\",\n\t2: \"total_amount\",\n\t3: \"subject\",\n\t4: \"merchant_id\",\n\t5: \"auth_code\",\n\t6: \"notify_url\",\n\t7: \"client_ip\",\n}\n\nfunc (p *QRPayReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.I64 {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField6(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField7(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QRPayReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QRPayReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OutOrderNo = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayReq) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.TotalAmount = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayReq) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.Subject = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayReq) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.MerchantId = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayReq) ReadField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.AuthCode = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayReq) ReadField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.NotifyUrl = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayReq) ReadField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.ClientIp = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QRPayReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField6(oprot); err != nil {\n\t\t\tfieldId = 6\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField7(oprot); err != nil {\n\t\t\tfieldId = 7\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *QRPayReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"out_order_no\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.OutOrderNo); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *QRPayReq) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"total_amount\", thrift.I64, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteI64(p.TotalAmount); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *QRPayReq) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"subject\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.Subject); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *QRPayReq) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"merchant_id\", thrift.STRING, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.MerchantId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *QRPayReq) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"auth_code\", thrift.STRING, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.AuthCode); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *QRPayReq) writeField6(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"notify_url\", thrift.STRING, 6); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.NotifyUrl); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 end error: \", p), err)\n}\n\nfunc (p *QRPayReq) writeField7(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"client_ip\", thrift.STRING, 7); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.ClientIp); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 end error: \", p), err)\n}\n\nfunc (p *QRPayReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"QRPayReq(%+v)\", *p)\n}\n\nfunc (p *QRPayReq) DeepEqual(ano *QRPayReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.OutOrderNo) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.TotalAmount) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.Subject) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.MerchantId) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.AuthCode) {\n\t\treturn false\n\t}\n\tif !p.Field6DeepEqual(ano.NotifyUrl) {\n\t\treturn false\n\t}\n\tif !p.Field7DeepEqual(ano.ClientIp) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *QRPayReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.OutOrderNo, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayReq) Field2DeepEqual(src int64) bool {\n\n\tif p.TotalAmount != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayReq) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.Subject, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayReq) Field4DeepEqual(src string) bool {\n\n\tif strings.Compare(p.MerchantId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayReq) Field5DeepEqual(src string) bool {\n\n\tif strings.Compare(p.AuthCode, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayReq) Field6DeepEqual(src string) bool {\n\n\tif strings.Compare(p.NotifyUrl, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayReq) Field7DeepEqual(src string) bool {\n\n\tif strings.Compare(p.ClientIp, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype QRPayResp struct {\n\tMerchantId       string `thrift:\"merchant_id,1\" json:\"merchant_id\"`\n\tSubMerchantId    string `thrift:\"sub_merchant_id,2\" json:\"sub_merchant_id\"`\n\tOutOrderNo       string `thrift:\"out_order_no,3\" json:\"out_order_no\"`\n\tOrderStatus      int8   `thrift:\"order_status,4\" json:\"order_status\"`\n\tPayWay           string `thrift:\"pay_way,5\" json:\"pay_way\"`\n\tOpenId           string `thrift:\"open_id,6\" json:\"open_id\"`\n\tOutTransactionId string `thrift:\"out_transaction_id,7\" json:\"out_transaction_id\"`\n\tSubOpenid        string `thrift:\"sub_openid,8\" json:\"sub_openid\"`\n}\n\nfunc NewQRPayResp() *QRPayResp {\n\treturn &QRPayResp{}\n}\n\nfunc (p *QRPayResp) GetMerchantId() (v string) {\n\treturn p.MerchantId\n}\n\nfunc (p *QRPayResp) GetSubMerchantId() (v string) {\n\treturn p.SubMerchantId\n}\n\nfunc (p *QRPayResp) GetOutOrderNo() (v string) {\n\treturn p.OutOrderNo\n}\n\nfunc (p *QRPayResp) GetOrderStatus() (v int8) {\n\treturn p.OrderStatus\n}\n\nfunc (p *QRPayResp) GetPayWay() (v string) {\n\treturn p.PayWay\n}\n\nfunc (p *QRPayResp) GetOpenId() (v string) {\n\treturn p.OpenId\n}\n\nfunc (p *QRPayResp) GetOutTransactionId() (v string) {\n\treturn p.OutTransactionId\n}\n\nfunc (p *QRPayResp) GetSubOpenid() (v string) {\n\treturn p.SubOpenid\n}\nfunc (p *QRPayResp) SetMerchantId(val string) {\n\tp.MerchantId = val\n}\nfunc (p *QRPayResp) SetSubMerchantId(val string) {\n\tp.SubMerchantId = val\n}\nfunc (p *QRPayResp) SetOutOrderNo(val string) {\n\tp.OutOrderNo = val\n}\nfunc (p *QRPayResp) SetOrderStatus(val int8) {\n\tp.OrderStatus = val\n}\nfunc (p *QRPayResp) SetPayWay(val string) {\n\tp.PayWay = val\n}\nfunc (p *QRPayResp) SetOpenId(val string) {\n\tp.OpenId = val\n}\nfunc (p *QRPayResp) SetOutTransactionId(val string) {\n\tp.OutTransactionId = val\n}\nfunc (p *QRPayResp) SetSubOpenid(val string) {\n\tp.SubOpenid = val\n}\n\nvar fieldIDToName_QRPayResp = map[int16]string{\n\t1: \"merchant_id\",\n\t2: \"sub_merchant_id\",\n\t3: \"out_order_no\",\n\t4: \"order_status\",\n\t5: \"pay_way\",\n\t6: \"open_id\",\n\t7: \"out_transaction_id\",\n\t8: \"sub_openid\",\n}\n\nfunc (p *QRPayResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField2(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 3:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField3(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 4:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tif err = p.ReadField4(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 5:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField5(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 6:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField6(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 7:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField7(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tcase 8:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField8(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QRPayResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QRPayResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.MerchantId = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayResp) ReadField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SubMerchantId = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayResp) ReadField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OutOrderNo = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayResp) ReadField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadByte(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OrderStatus = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayResp) ReadField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.PayWay = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayResp) ReadField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OpenId = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayResp) ReadField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OutTransactionId = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayResp) ReadField8(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.SubOpenid = v\n\t}\n\treturn nil\n}\n\nfunc (p *QRPayResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QRPayResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField2(oprot); err != nil {\n\t\t\tfieldId = 2\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField3(oprot); err != nil {\n\t\t\tfieldId = 3\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField4(oprot); err != nil {\n\t\t\tfieldId = 4\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField5(oprot); err != nil {\n\t\t\tfieldId = 5\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField6(oprot); err != nil {\n\t\t\tfieldId = 6\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField7(oprot); err != nil {\n\t\t\tfieldId = 7\n\t\t\tgoto WriteFieldError\n\t\t}\n\t\tif err = p.writeField8(oprot); err != nil {\n\t\t\tfieldId = 8\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *QRPayResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"merchant_id\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.MerchantId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *QRPayResp) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"sub_merchant_id\", thrift.STRING, 2); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.SubMerchantId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 2 end error: \", p), err)\n}\n\nfunc (p *QRPayResp) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"out_order_no\", thrift.STRING, 3); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.OutOrderNo); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 3 end error: \", p), err)\n}\n\nfunc (p *QRPayResp) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"order_status\", thrift.BYTE, 4); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteByte(p.OrderStatus); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 4 end error: \", p), err)\n}\n\nfunc (p *QRPayResp) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"pay_way\", thrift.STRING, 5); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.PayWay); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 5 end error: \", p), err)\n}\n\nfunc (p *QRPayResp) writeField6(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"open_id\", thrift.STRING, 6); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.OpenId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 6 end error: \", p), err)\n}\n\nfunc (p *QRPayResp) writeField7(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"out_transaction_id\", thrift.STRING, 7); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.OutTransactionId); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 7 end error: \", p), err)\n}\n\nfunc (p *QRPayResp) writeField8(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"sub_openid\", thrift.STRING, 8); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.SubOpenid); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 8 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 8 end error: \", p), err)\n}\n\nfunc (p *QRPayResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"QRPayResp(%+v)\", *p)\n}\n\nfunc (p *QRPayResp) DeepEqual(ano *QRPayResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.MerchantId) {\n\t\treturn false\n\t}\n\tif !p.Field2DeepEqual(ano.SubMerchantId) {\n\t\treturn false\n\t}\n\tif !p.Field3DeepEqual(ano.OutOrderNo) {\n\t\treturn false\n\t}\n\tif !p.Field4DeepEqual(ano.OrderStatus) {\n\t\treturn false\n\t}\n\tif !p.Field5DeepEqual(ano.PayWay) {\n\t\treturn false\n\t}\n\tif !p.Field6DeepEqual(ano.OpenId) {\n\t\treturn false\n\t}\n\tif !p.Field7DeepEqual(ano.OutTransactionId) {\n\t\treturn false\n\t}\n\tif !p.Field8DeepEqual(ano.SubOpenid) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *QRPayResp) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.MerchantId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayResp) Field2DeepEqual(src string) bool {\n\n\tif strings.Compare(p.SubMerchantId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayResp) Field3DeepEqual(src string) bool {\n\n\tif strings.Compare(p.OutOrderNo, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayResp) Field4DeepEqual(src int8) bool {\n\n\tif p.OrderStatus != src {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayResp) Field5DeepEqual(src string) bool {\n\n\tif strings.Compare(p.PayWay, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayResp) Field6DeepEqual(src string) bool {\n\n\tif strings.Compare(p.OpenId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayResp) Field7DeepEqual(src string) bool {\n\n\tif strings.Compare(p.OutTransactionId, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (p *QRPayResp) Field8DeepEqual(src string) bool {\n\n\tif strings.Compare(p.SubOpenid, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype QueryOrderReq struct {\n\tOutOrderNo string `thrift:\"out_order_no,1\" json:\"out_order_no\"`\n}\n\nfunc NewQueryOrderReq() *QueryOrderReq {\n\treturn &QueryOrderReq{}\n}\n\nfunc (p *QueryOrderReq) GetOutOrderNo() (v string) {\n\treturn p.OutOrderNo\n}\nfunc (p *QueryOrderReq) SetOutOrderNo(val string) {\n\tp.OutOrderNo = val\n}\n\nvar fieldIDToName_QueryOrderReq = map[int16]string{\n\t1: \"out_order_no\",\n}\n\nfunc (p *QueryOrderReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryOrderReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OutOrderNo = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryOrderReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryOrderReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *QueryOrderReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"out_order_no\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.OutOrderNo); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *QueryOrderReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"QueryOrderReq(%+v)\", *p)\n}\n\nfunc (p *QueryOrderReq) DeepEqual(ano *QueryOrderReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.OutOrderNo) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *QueryOrderReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.OutOrderNo, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype QueryOrderResp struct {\n\tOrderStatus int8 `thrift:\"order_status,1\" json:\"order_status\"`\n}\n\nfunc NewQueryOrderResp() *QueryOrderResp {\n\treturn &QueryOrderResp{}\n}\n\nfunc (p *QueryOrderResp) GetOrderStatus() (v int8) {\n\treturn p.OrderStatus\n}\nfunc (p *QueryOrderResp) SetOrderStatus(val int8) {\n\tp.OrderStatus = val\n}\n\nvar fieldIDToName_QueryOrderResp = map[int16]string{\n\t1: \"order_status\",\n}\n\nfunc (p *QueryOrderResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.BYTE {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_QueryOrderResp[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *QueryOrderResp) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadByte(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OrderStatus = v\n\t}\n\treturn nil\n}\n\nfunc (p *QueryOrderResp) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryOrderResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *QueryOrderResp) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"order_status\", thrift.BYTE, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteByte(p.OrderStatus); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *QueryOrderResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"QueryOrderResp(%+v)\", *p)\n}\n\nfunc (p *QueryOrderResp) DeepEqual(ano *QueryOrderResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.OrderStatus) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *QueryOrderResp) Field1DeepEqual(src int8) bool {\n\n\tif p.OrderStatus != src {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CloseOrderReq struct {\n\tOutOrderNo string `thrift:\"out_order_no,1\" json:\"out_order_no\"`\n}\n\nfunc NewCloseOrderReq() *CloseOrderReq {\n\treturn &CloseOrderReq{}\n}\n\nfunc (p *CloseOrderReq) GetOutOrderNo() (v string) {\n\treturn p.OutOrderNo\n}\nfunc (p *CloseOrderReq) SetOutOrderNo(val string) {\n\tp.OutOrderNo = val\n}\n\nvar fieldIDToName_CloseOrderReq = map[int16]string{\n\t1: \"out_order_no\",\n}\n\nfunc (p *CloseOrderReq) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRING {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_CloseOrderReq[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CloseOrderReq) ReadField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn err\n\t} else {\n\t\tp.OutOrderNo = v\n\t}\n\treturn nil\n}\n\nfunc (p *CloseOrderReq) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CloseOrderReq\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CloseOrderReq) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"out_order_no\", thrift.STRING, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := oprot.WriteString(p.OutOrderNo); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *CloseOrderReq) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CloseOrderReq(%+v)\", *p)\n}\n\nfunc (p *CloseOrderReq) DeepEqual(ano *CloseOrderReq) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.OutOrderNo) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *CloseOrderReq) Field1DeepEqual(src string) bool {\n\n\tif strings.Compare(p.OutOrderNo, src) != 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype CloseOrderResp struct {\n}\n\nfunc NewCloseOrderResp() *CloseOrderResp {\n\treturn &CloseOrderResp{}\n}\n\nvar fieldIDToName_CloseOrderResp = map[int16]string{}\n\nfunc (p *CloseOrderResp) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\tgoto SkipFieldTypeError\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nSkipFieldTypeError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T skip field type %d error\", p, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *CloseOrderResp) Write(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteStructBegin(\"CloseOrderResp\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *CloseOrderResp) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"CloseOrderResp(%+v)\", *p)\n}\n\nfunc (p *CloseOrderResp) DeepEqual(ano *CloseOrderResp) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype PaymentSvc interface {\n\tUnifyPay(ctx context.Context, req *UnifyPayReq) (r *UnifyPayResp, err error)\n\n\tQRPay(ctx context.Context, req *QRPayReq) (r *QRPayResp, err error)\n\n\tQueryOrder(ctx context.Context, req *QueryOrderReq) (r *QueryOrderResp, err error)\n\n\tCloseOrder(ctx context.Context, req *CloseOrderReq) (r *CloseOrderResp, err error)\n}\n\ntype PaymentSvcClient struct {\n\tc thrift.TClient\n}\n\nfunc NewPaymentSvcClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *PaymentSvcClient {\n\treturn &PaymentSvcClient{\n\t\tc: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),\n\t}\n}\n\nfunc NewPaymentSvcClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *PaymentSvcClient {\n\treturn &PaymentSvcClient{\n\t\tc: thrift.NewTStandardClient(iprot, oprot),\n\t}\n}\n\nfunc NewPaymentSvcClient(c thrift.TClient) *PaymentSvcClient {\n\treturn &PaymentSvcClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *PaymentSvcClient) Client_() thrift.TClient {\n\treturn p.c\n}\n\nfunc (p *PaymentSvcClient) UnifyPay(ctx context.Context, req *UnifyPayReq) (r *UnifyPayResp, err error) {\n\tvar _args PaymentSvcUnifyPayArgs\n\t_args.Req = req\n\tvar _result PaymentSvcUnifyPayResult\n\tif err = p.Client_().Call(ctx, \"UnifyPay\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *PaymentSvcClient) QRPay(ctx context.Context, req *QRPayReq) (r *QRPayResp, err error) {\n\tvar _args PaymentSvcQRPayArgs\n\t_args.Req = req\n\tvar _result PaymentSvcQRPayResult\n\tif err = p.Client_().Call(ctx, \"QRPay\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *PaymentSvcClient) QueryOrder(ctx context.Context, req *QueryOrderReq) (r *QueryOrderResp, err error) {\n\tvar _args PaymentSvcQueryOrderArgs\n\t_args.Req = req\n\tvar _result PaymentSvcQueryOrderResult\n\tif err = p.Client_().Call(ctx, \"QueryOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *PaymentSvcClient) CloseOrder(ctx context.Context, req *CloseOrderReq) (r *CloseOrderResp, err error) {\n\tvar _args PaymentSvcCloseOrderArgs\n\t_args.Req = req\n\tvar _result PaymentSvcCloseOrderResult\n\tif err = p.Client_().Call(ctx, \"CloseOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\ntype PaymentSvcProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      PaymentSvc\n}\n\nfunc (p *PaymentSvcProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *PaymentSvcProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *PaymentSvcProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewPaymentSvcProcessor(handler PaymentSvc) *PaymentSvcProcessor {\n\tself := &PaymentSvcProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself.AddToProcessorMap(\"UnifyPay\", &paymentSvcProcessorUnifyPay{handler: handler})\n\tself.AddToProcessorMap(\"QRPay\", &paymentSvcProcessorQRPay{handler: handler})\n\tself.AddToProcessorMap(\"QueryOrder\", &paymentSvcProcessorQueryOrder{handler: handler})\n\tself.AddToProcessorMap(\"CloseOrder\", &paymentSvcProcessorCloseOrder{handler: handler})\n\treturn self\n}\nfunc (p *PaymentSvcProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(ctx, seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush(ctx)\n\treturn false, x\n}\n\ntype paymentSvcProcessorUnifyPay struct {\n\thandler PaymentSvc\n}\n\nfunc (p *paymentSvcProcessorUnifyPay) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := PaymentSvcUnifyPayArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"UnifyPay\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := PaymentSvcUnifyPayResult{}\n\tvar retval *UnifyPayResp\n\tif retval, err2 = p.handler.UnifyPay(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing UnifyPay: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"UnifyPay\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"UnifyPay\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype paymentSvcProcessorQRPay struct {\n\thandler PaymentSvc\n}\n\nfunc (p *paymentSvcProcessorQRPay) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := PaymentSvcQRPayArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"QRPay\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := PaymentSvcQRPayResult{}\n\tvar retval *QRPayResp\n\tif retval, err2 = p.handler.QRPay(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing QRPay: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"QRPay\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"QRPay\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype paymentSvcProcessorQueryOrder struct {\n\thandler PaymentSvc\n}\n\nfunc (p *paymentSvcProcessorQueryOrder) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := PaymentSvcQueryOrderArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"QueryOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := PaymentSvcQueryOrderResult{}\n\tvar retval *QueryOrderResp\n\tif retval, err2 = p.handler.QueryOrder(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing QueryOrder: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"QueryOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"QueryOrder\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype paymentSvcProcessorCloseOrder struct {\n\thandler PaymentSvc\n}\n\nfunc (p *paymentSvcProcessorCloseOrder) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := PaymentSvcCloseOrderArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"CloseOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tresult := PaymentSvcCloseOrderResult{}\n\tvar retval *CloseOrderResp\n\tif retval, err2 = p.handler.CloseOrder(ctx, args.Req); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing CloseOrder: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"CloseOrder\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush(ctx)\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"CloseOrder\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(ctx); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\ntype PaymentSvcUnifyPayArgs struct {\n\tReq *UnifyPayReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewPaymentSvcUnifyPayArgs() *PaymentSvcUnifyPayArgs {\n\treturn &PaymentSvcUnifyPayArgs{}\n}\n\nvar PaymentSvcUnifyPayArgs_Req_DEFAULT *UnifyPayReq\n\nfunc (p *PaymentSvcUnifyPayArgs) GetReq() (v *UnifyPayReq) {\n\tif !p.IsSetReq() {\n\t\treturn PaymentSvcUnifyPayArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *PaymentSvcUnifyPayArgs) SetReq(val *UnifyPayReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_PaymentSvcUnifyPayArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcUnifyPayArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewUnifyPayReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UnifyPay_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"PaymentSvcUnifyPayArgs(%+v)\", *p)\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) DeepEqual(ano *PaymentSvcUnifyPayArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *PaymentSvcUnifyPayArgs) Field1DeepEqual(src *UnifyPayReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype PaymentSvcUnifyPayResult struct {\n\tSuccess *UnifyPayResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewPaymentSvcUnifyPayResult() *PaymentSvcUnifyPayResult {\n\treturn &PaymentSvcUnifyPayResult{}\n}\n\nvar PaymentSvcUnifyPayResult_Success_DEFAULT *UnifyPayResp\n\nfunc (p *PaymentSvcUnifyPayResult) GetSuccess() (v *UnifyPayResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn PaymentSvcUnifyPayResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *PaymentSvcUnifyPayResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*UnifyPayResp)\n}\n\nvar fieldIDToName_PaymentSvcUnifyPayResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *PaymentSvcUnifyPayResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PaymentSvcUnifyPayResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcUnifyPayResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcUnifyPayResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewUnifyPayResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *PaymentSvcUnifyPayResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"UnifyPay_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcUnifyPayResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *PaymentSvcUnifyPayResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"PaymentSvcUnifyPayResult(%+v)\", *p)\n}\n\nfunc (p *PaymentSvcUnifyPayResult) DeepEqual(ano *PaymentSvcUnifyPayResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *PaymentSvcUnifyPayResult) Field0DeepEqual(src *UnifyPayResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype PaymentSvcQRPayArgs struct {\n\tReq *QRPayReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewPaymentSvcQRPayArgs() *PaymentSvcQRPayArgs {\n\treturn &PaymentSvcQRPayArgs{}\n}\n\nvar PaymentSvcQRPayArgs_Req_DEFAULT *QRPayReq\n\nfunc (p *PaymentSvcQRPayArgs) GetReq() (v *QRPayReq) {\n\tif !p.IsSetReq() {\n\t\treturn PaymentSvcQRPayArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *PaymentSvcQRPayArgs) SetReq(val *QRPayReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_PaymentSvcQRPayArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *PaymentSvcQRPayArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PaymentSvcQRPayArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcQRPayArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQRPayArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewQRPayReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *PaymentSvcQRPayArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QRPay_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQRPayArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQRPayArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"PaymentSvcQRPayArgs(%+v)\", *p)\n}\n\nfunc (p *PaymentSvcQRPayArgs) DeepEqual(ano *PaymentSvcQRPayArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *PaymentSvcQRPayArgs) Field1DeepEqual(src *QRPayReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype PaymentSvcQRPayResult struct {\n\tSuccess *QRPayResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewPaymentSvcQRPayResult() *PaymentSvcQRPayResult {\n\treturn &PaymentSvcQRPayResult{}\n}\n\nvar PaymentSvcQRPayResult_Success_DEFAULT *QRPayResp\n\nfunc (p *PaymentSvcQRPayResult) GetSuccess() (v *QRPayResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn PaymentSvcQRPayResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *PaymentSvcQRPayResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*QRPayResp)\n}\n\nvar fieldIDToName_PaymentSvcQRPayResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *PaymentSvcQRPayResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PaymentSvcQRPayResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcQRPayResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQRPayResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewQRPayResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *PaymentSvcQRPayResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QRPay_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQRPayResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQRPayResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"PaymentSvcQRPayResult(%+v)\", *p)\n}\n\nfunc (p *PaymentSvcQRPayResult) DeepEqual(ano *PaymentSvcQRPayResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *PaymentSvcQRPayResult) Field0DeepEqual(src *QRPayResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype PaymentSvcQueryOrderArgs struct {\n\tReq *QueryOrderReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewPaymentSvcQueryOrderArgs() *PaymentSvcQueryOrderArgs {\n\treturn &PaymentSvcQueryOrderArgs{}\n}\n\nvar PaymentSvcQueryOrderArgs_Req_DEFAULT *QueryOrderReq\n\nfunc (p *PaymentSvcQueryOrderArgs) GetReq() (v *QueryOrderReq) {\n\tif !p.IsSetReq() {\n\t\treturn PaymentSvcQueryOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *PaymentSvcQueryOrderArgs) SetReq(val *QueryOrderReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_PaymentSvcQueryOrderArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcQueryOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewQueryOrderReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryOrder_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"PaymentSvcQueryOrderArgs(%+v)\", *p)\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) DeepEqual(ano *PaymentSvcQueryOrderArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *PaymentSvcQueryOrderArgs) Field1DeepEqual(src *QueryOrderReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype PaymentSvcQueryOrderResult struct {\n\tSuccess *QueryOrderResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewPaymentSvcQueryOrderResult() *PaymentSvcQueryOrderResult {\n\treturn &PaymentSvcQueryOrderResult{}\n}\n\nvar PaymentSvcQueryOrderResult_Success_DEFAULT *QueryOrderResp\n\nfunc (p *PaymentSvcQueryOrderResult) GetSuccess() (v *QueryOrderResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn PaymentSvcQueryOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *PaymentSvcQueryOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*QueryOrderResp)\n}\n\nvar fieldIDToName_PaymentSvcQueryOrderResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *PaymentSvcQueryOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PaymentSvcQueryOrderResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcQueryOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQueryOrderResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewQueryOrderResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *PaymentSvcQueryOrderResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"QueryOrder_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQueryOrderResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *PaymentSvcQueryOrderResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"PaymentSvcQueryOrderResult(%+v)\", *p)\n}\n\nfunc (p *PaymentSvcQueryOrderResult) DeepEqual(ano *PaymentSvcQueryOrderResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *PaymentSvcQueryOrderResult) Field0DeepEqual(src *QueryOrderResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype PaymentSvcCloseOrderArgs struct {\n\tReq *CloseOrderReq `thrift:\"req,1\" json:\"req\"`\n}\n\nfunc NewPaymentSvcCloseOrderArgs() *PaymentSvcCloseOrderArgs {\n\treturn &PaymentSvcCloseOrderArgs{}\n}\n\nvar PaymentSvcCloseOrderArgs_Req_DEFAULT *CloseOrderReq\n\nfunc (p *PaymentSvcCloseOrderArgs) GetReq() (v *CloseOrderReq) {\n\tif !p.IsSetReq() {\n\t\treturn PaymentSvcCloseOrderArgs_Req_DEFAULT\n\t}\n\treturn p.Req\n}\nfunc (p *PaymentSvcCloseOrderArgs) SetReq(val *CloseOrderReq) {\n\tp.Req = val\n}\n\nvar fieldIDToName_PaymentSvcCloseOrderArgs = map[int16]string{\n\t1: \"req\",\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) IsSetReq() bool {\n\treturn p.Req != nil\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField1(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcCloseOrderArgs[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) ReadField1(iprot thrift.TProtocol) error {\n\tp.Req = NewCloseOrderReq()\n\tif err := p.Req.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CloseOrder_args\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField1(oprot); err != nil {\n\t\t\tfieldId = 1\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err = oprot.WriteFieldBegin(\"req\", thrift.STRUCT, 1); err != nil {\n\t\tgoto WriteFieldBeginError\n\t}\n\tif err := p.Req.Write(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\tgoto WriteFieldEndError\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 1 end error: \", p), err)\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"PaymentSvcCloseOrderArgs(%+v)\", *p)\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) DeepEqual(ano *PaymentSvcCloseOrderArgs) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field1DeepEqual(ano.Req) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *PaymentSvcCloseOrderArgs) Field1DeepEqual(src *CloseOrderReq) bool {\n\n\tif !p.Req.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype PaymentSvcCloseOrderResult struct {\n\tSuccess *CloseOrderResp `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewPaymentSvcCloseOrderResult() *PaymentSvcCloseOrderResult {\n\treturn &PaymentSvcCloseOrderResult{}\n}\n\nvar PaymentSvcCloseOrderResult_Success_DEFAULT *CloseOrderResp\n\nfunc (p *PaymentSvcCloseOrderResult) GetSuccess() (v *CloseOrderResp) {\n\tif !p.IsSetSuccess() {\n\t\treturn PaymentSvcCloseOrderResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *PaymentSvcCloseOrderResult) SetSuccess(x interface{}) {\n\tp.Success = x.(*CloseOrderResp)\n}\n\nvar fieldIDToName_PaymentSvcCloseOrderResult = map[int16]string{\n\t0: \"success\",\n}\n\nfunc (p *PaymentSvcCloseOrderResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *PaymentSvcCloseOrderResult) Read(iprot thrift.TProtocol) (err error) {\n\n\tvar fieldTypeId thrift.TType\n\tvar fieldId int16\n\n\tif _, err = iprot.ReadStructBegin(); err != nil {\n\t\tgoto ReadStructBeginError\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err = iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\tgoto ReadFieldBeginError\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif fieldTypeId == thrift.STRUCT {\n\t\t\t\tif err = p.ReadField0(iprot); err != nil {\n\t\t\t\t\tgoto ReadFieldError\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\t\tgoto SkipFieldError\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\tgoto SkipFieldError\n\t\t\t}\n\t\t}\n\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\tgoto ReadFieldEndError\n\t\t}\n\t}\n\tif err = iprot.ReadStructEnd(); err != nil {\n\t\tgoto ReadStructEndError\n\t}\n\n\treturn nil\nReadStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct begin error: \", p), err)\nReadFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d begin error: \", p, fieldId), err)\nReadFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field %d '%s' error: \", p, fieldId, fieldIDToName_PaymentSvcCloseOrderResult[fieldId]), err)\nSkipFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d skip type %d error: \", p, fieldId, fieldTypeId), err)\n\nReadFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read field end error\", p), err)\nReadStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcCloseOrderResult) ReadField0(iprot thrift.TProtocol) error {\n\tp.Success = NewCloseOrderResp()\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (p *PaymentSvcCloseOrderResult) Write(oprot thrift.TProtocol) (err error) {\n\tvar fieldId int16\n\tif err = oprot.WriteStructBegin(\"CloseOrder_result\"); err != nil {\n\t\tgoto WriteStructBeginError\n\t}\n\tif p != nil {\n\t\tif err = p.writeField0(oprot); err != nil {\n\t\t\tfieldId = 0\n\t\t\tgoto WriteFieldError\n\t\t}\n\n\t}\n\tif err = oprot.WriteFieldStop(); err != nil {\n\t\tgoto WriteFieldStopError\n\t}\n\tif err = oprot.WriteStructEnd(); err != nil {\n\t\tgoto WriteStructEndError\n\t}\n\treturn nil\nWriteStructBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\nWriteFieldError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field %d error: \", p, fieldId), err)\nWriteFieldStopError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field stop error: \", p), err)\nWriteStructEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct end error: \", p), err)\n}\n\nfunc (p *PaymentSvcCloseOrderResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err = oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\tgoto WriteFieldBeginError\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = oprot.WriteFieldEnd(); err != nil {\n\t\t\tgoto WriteFieldEndError\n\t\t}\n\t}\n\treturn nil\nWriteFieldBeginError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 begin error: \", p), err)\nWriteFieldEndError:\n\treturn thrift.PrependError(fmt.Sprintf(\"%T write field 0 end error: \", p), err)\n}\n\nfunc (p *PaymentSvcCloseOrderResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"PaymentSvcCloseOrderResult(%+v)\", *p)\n}\n\nfunc (p *PaymentSvcCloseOrderResult) DeepEqual(ano *PaymentSvcCloseOrderResult) bool {\n\tif p == ano {\n\t\treturn true\n\t} else if p == nil || ano == nil {\n\t\treturn false\n\t}\n\tif !p.Field0DeepEqual(ano.Success) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (p *PaymentSvcCloseOrderResult) Field0DeepEqual(src *CloseOrderResp) bool {\n\n\tif !p.Success.DeepEqual(src) {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/payment/paymentsvc/client.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage paymentsvc\n\nimport (\n\t\"context\"\n\n\tpayment \"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tcallopt \"github.com/cloudwego/kitex/client/callopt\"\n)\n\n// Client is designed to provide IDL-compatible methods with call-option parameter for kitex framework.\ntype Client interface {\n\tUnifyPay(ctx context.Context, req *payment.UnifyPayReq, callOptions ...callopt.Option) (r *payment.UnifyPayResp, err error)\n\tQRPay(ctx context.Context, req *payment.QRPayReq, callOptions ...callopt.Option) (r *payment.QRPayResp, err error)\n\tQueryOrder(ctx context.Context, req *payment.QueryOrderReq, callOptions ...callopt.Option) (r *payment.QueryOrderResp, err error)\n\tCloseOrder(ctx context.Context, req *payment.CloseOrderReq, callOptions ...callopt.Option) (r *payment.CloseOrderResp, err error)\n}\n\n// NewClient creates a client for the service defined in IDL.\nfunc NewClient(destService string, opts ...client.Option) (Client, error) {\n\tvar options []client.Option\n\toptions = append(options, client.WithDestService(destService))\n\n\toptions = append(options, opts...)\n\n\tkc, err := client.NewClient(serviceInfo(), options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kPaymentSvcClient{\n\t\tkClient: newServiceClient(kc),\n\t}, nil\n}\n\n// MustNewClient creates a client for the service defined in IDL. It panics if any error occurs.\nfunc MustNewClient(destService string, opts ...client.Option) Client {\n\tkc, err := NewClient(destService, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn kc\n}\n\ntype kPaymentSvcClient struct {\n\t*kClient\n}\n\nfunc (p *kPaymentSvcClient) UnifyPay(ctx context.Context, req *payment.UnifyPayReq, callOptions ...callopt.Option) (r *payment.UnifyPayResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.UnifyPay(ctx, req)\n}\n\nfunc (p *kPaymentSvcClient) QRPay(ctx context.Context, req *payment.QRPayReq, callOptions ...callopt.Option) (r *payment.QRPayResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.QRPay(ctx, req)\n}\n\nfunc (p *kPaymentSvcClient) QueryOrder(ctx context.Context, req *payment.QueryOrderReq, callOptions ...callopt.Option) (r *payment.QueryOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.QueryOrder(ctx, req)\n}\n\nfunc (p *kPaymentSvcClient) CloseOrder(ctx context.Context, req *payment.CloseOrderReq, callOptions ...callopt.Option) (r *payment.CloseOrderResp, err error) {\n\tctx = client.NewCtxWithCallOptions(ctx, callOptions)\n\treturn p.kClient.CloseOrder(ctx, req)\n}\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/payment/paymentsvc/invoker.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage paymentsvc\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewInvoker creates a server.Invoker with the given handler and options.\nfunc NewInvoker(handler payment.PaymentSvc, opts ...server.Option) server.Invoker {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\ts := server.NewInvoker(options...)\n\tif err := s.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := s.Init(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/payment/paymentsvc/paymentsvc.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\n\npackage paymentsvc\n\nimport (\n\t\"context\"\n\n\tpayment \"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/payment\"\n\tclient \"github.com/cloudwego/kitex/client\"\n\tkitex \"github.com/cloudwego/kitex/pkg/serviceinfo\"\n)\n\nfunc serviceInfo() *kitex.ServiceInfo {\n\treturn paymentSvcServiceInfo\n}\n\nvar paymentSvcServiceInfo = NewServiceInfo()\n\nfunc NewServiceInfo() *kitex.ServiceInfo {\n\tserviceName := \"PaymentSvc\"\n\thandlerType := (*payment.PaymentSvc)(nil)\n\tmethods := map[string]kitex.MethodInfo{\n\t\t\"UnifyPay\":   kitex.NewMethodInfo(unifyPayHandler, newPaymentSvcUnifyPayArgs, newPaymentSvcUnifyPayResult, false),\n\t\t\"QRPay\":      kitex.NewMethodInfo(qRPayHandler, newPaymentSvcQRPayArgs, newPaymentSvcQRPayResult, false),\n\t\t\"QueryOrder\": kitex.NewMethodInfo(queryOrderHandler, newPaymentSvcQueryOrderArgs, newPaymentSvcQueryOrderResult, false),\n\t\t\"CloseOrder\": kitex.NewMethodInfo(closeOrderHandler, newPaymentSvcCloseOrderArgs, newPaymentSvcCloseOrderResult, false),\n\t}\n\textra := map[string]interface{}{\n\t\t\"PackageName\": \"payment\",\n\t}\n\tsvcInfo := &kitex.ServiceInfo{\n\t\tServiceName:     serviceName,\n\t\tHandlerType:     handlerType,\n\t\tMethods:         methods,\n\t\tPayloadCodec:    kitex.Thrift,\n\t\tKiteXGenVersion: \"v0.4.3\",\n\t\tExtra:           extra,\n\t}\n\treturn svcInfo\n}\n\nfunc unifyPayHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*payment.PaymentSvcUnifyPayArgs)\n\trealResult := result.(*payment.PaymentSvcUnifyPayResult)\n\tsuccess, err := handler.(payment.PaymentSvc).UnifyPay(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newPaymentSvcUnifyPayArgs() interface{} {\n\treturn payment.NewPaymentSvcUnifyPayArgs()\n}\n\nfunc newPaymentSvcUnifyPayResult() interface{} {\n\treturn payment.NewPaymentSvcUnifyPayResult()\n}\n\nfunc qRPayHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*payment.PaymentSvcQRPayArgs)\n\trealResult := result.(*payment.PaymentSvcQRPayResult)\n\tsuccess, err := handler.(payment.PaymentSvc).QRPay(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newPaymentSvcQRPayArgs() interface{} {\n\treturn payment.NewPaymentSvcQRPayArgs()\n}\n\nfunc newPaymentSvcQRPayResult() interface{} {\n\treturn payment.NewPaymentSvcQRPayResult()\n}\n\nfunc queryOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*payment.PaymentSvcQueryOrderArgs)\n\trealResult := result.(*payment.PaymentSvcQueryOrderResult)\n\tsuccess, err := handler.(payment.PaymentSvc).QueryOrder(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newPaymentSvcQueryOrderArgs() interface{} {\n\treturn payment.NewPaymentSvcQueryOrderArgs()\n}\n\nfunc newPaymentSvcQueryOrderResult() interface{} {\n\treturn payment.NewPaymentSvcQueryOrderResult()\n}\n\nfunc closeOrderHandler(ctx context.Context, handler interface{}, arg, result interface{}) error {\n\trealArg := arg.(*payment.PaymentSvcCloseOrderArgs)\n\trealResult := result.(*payment.PaymentSvcCloseOrderResult)\n\tsuccess, err := handler.(payment.PaymentSvc).CloseOrder(ctx, realArg.Req)\n\tif err != nil {\n\t\treturn err\n\t}\n\trealResult.Success = success\n\treturn nil\n}\nfunc newPaymentSvcCloseOrderArgs() interface{} {\n\treturn payment.NewPaymentSvcCloseOrderArgs()\n}\n\nfunc newPaymentSvcCloseOrderResult() interface{} {\n\treturn payment.NewPaymentSvcCloseOrderResult()\n}\n\ntype kClient struct {\n\tc client.Client\n}\n\nfunc newServiceClient(c client.Client) *kClient {\n\treturn &kClient{\n\t\tc: c,\n\t}\n}\n\nfunc (p *kClient) UnifyPay(ctx context.Context, req *payment.UnifyPayReq) (r *payment.UnifyPayResp, err error) {\n\tvar _args payment.PaymentSvcUnifyPayArgs\n\t_args.Req = req\n\tvar _result payment.PaymentSvcUnifyPayResult\n\tif err = p.c.Call(ctx, \"UnifyPay\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) QRPay(ctx context.Context, req *payment.QRPayReq) (r *payment.QRPayResp, err error) {\n\tvar _args payment.PaymentSvcQRPayArgs\n\t_args.Req = req\n\tvar _result payment.PaymentSvcQRPayResult\n\tif err = p.c.Call(ctx, \"QRPay\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) QueryOrder(ctx context.Context, req *payment.QueryOrderReq) (r *payment.QueryOrderResp, err error) {\n\tvar _args payment.PaymentSvcQueryOrderArgs\n\t_args.Req = req\n\tvar _result payment.PaymentSvcQueryOrderResult\n\tif err = p.c.Call(ctx, \"QueryOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n\nfunc (p *kClient) CloseOrder(ctx context.Context, req *payment.CloseOrderReq) (r *payment.CloseOrderResp, err error) {\n\tvar _args payment.PaymentSvcCloseOrderArgs\n\t_args.Req = req\n\tvar _result payment.PaymentSvcCloseOrderResult\n\tif err = p.c.Call(ctx, \"CloseOrder\", &_args, &_result); err != nil {\n\t\treturn\n\t}\n\treturn _result.GetSuccess(), nil\n}\n"
  },
  {
    "path": "open-payment-platform/kitex_gen/payment/paymentsvc/server.go",
    "content": "// Code generated by Kitex v0.4.3. DO NOT EDIT.\npackage paymentsvc\n\nimport (\n\tpayment \"github.com/cloudwego/biz-demo/open-payment-platform/kitex_gen/payment\"\n\tserver \"github.com/cloudwego/kitex/server\"\n)\n\n// NewServer creates a server.Server with the given handler and options.\nfunc NewServer(handler payment.PaymentSvc, opts ...server.Option) server.Server {\n\tvar options []server.Option\n\n\toptions = append(options, opts...)\n\n\tsvr := server.NewServer(options...)\n\tif err := svr.RegisterService(serviceInfo(), handler); err != nil {\n\t\tpanic(err)\n\t}\n\treturn svr\n}\n"
  },
  {
    "path": "open-payment-platform/licenses/LICENSE-ent.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "open-payment-platform/licenses/LICENSE-errors.txt",
    "content": "Copyright (c) 2015, Dave Cheney <dave@cheney.net>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "open-payment-platform/licenses/LICENSE-mysql.txt",
    "content": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n    means each individual or legal entity that creates, contributes to\n    the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n    means the combination of the Contributions of others (if any) used\n    by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n    means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n    means Source Code Form to which the initial Contributor has attached\n    the notice in Exhibit A, the Executable Form of such Source Code\n    Form, and Modifications of such Source Code Form, in each case\n    including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n    means\n\n    (a) that the initial Contributor has attached the notice described\n        in Exhibit B to the Covered Software; or\n\n    (b) that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the\n        terms of a Secondary License.\n\n1.6. \"Executable Form\"\n    means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n    means a work that combines Covered Software with other material, in\n    a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n    means this document.\n\n1.9. \"Licensable\"\n    means having the right to grant, to the maximum extent possible,\n    whether at the time of the initial grant or subsequently, any and\n    all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n    means any of the following:\n\n    (a) any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered\n        Software; or\n\n    (b) any new file in Source Code Form that contains any Covered\n        Software.\n\n1.11. \"Patent Claims\" of a Contributor\n    means any patent claim(s), including without limitation, method,\n    process, and apparatus claims, in any patent Licensable by such\n    Contributor that would be infringed, but for the grant of the\n    License, by the making, using, selling, offering for sale, having\n    made, import, or transfer of either its Contributions or its\n    Contributor Version.\n\n1.12. \"Secondary License\"\n    means either the GNU General Public License, Version 2.0, the GNU\n    Lesser General Public License, Version 2.1, the GNU Affero General\n    Public License, Version 3.0, or any later versions of those\n    licenses.\n\n1.13. \"Source Code Form\"\n    means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n    means an individual or a legal entity exercising rights under this\n    License. For legal entities, \"You\" includes any entity that\n    controls, is controlled by, or is under common control with You. For\n    purposes of this definition, \"control\" means (a) the power, direct\n    or indirect, to cause the direction or management of such entity,\n    whether by contract or otherwise, or (b) ownership of more than\n    fifty percent (50%) of the outstanding shares or beneficial\n    ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n    Licensable by such Contributor to use, reproduce, make available,\n    modify, display, perform, distribute, and otherwise exploit its\n    Contributions, either on an unmodified basis, with Modifications, or\n    as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n    for sale, have made, import, and otherwise transfer either its\n    Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n    or\n\n(b) for infringements caused by: (i) Your and any other third party's\n    modifications of Covered Software, or (ii) the combination of its\n    Contributions with other software (except as part of its Contributor\n    Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n    its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n    Form, as described in Section 3.1, and You must inform recipients of\n    the Executable Form how they can obtain a copy of such Source Code\n    Form by reasonable means in a timely manner, at a charge no more\n    than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n    License, or sublicense it under different terms, provided that the\n    license for the Executable Form does not attempt to limit or alter\n    the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n*                                                                      *\n*  6. Disclaimer of Warranty                                           *\n*  -------------------------                                           *\n*                                                                      *\n*  Covered Software is provided under this License on an \"as is\"       *\n*  basis, without warranty of any kind, either expressed, implied, or  *\n*  statutory, including, without limitation, warranties that the       *\n*  Covered Software is free of defects, merchantable, fit for a        *\n*  particular purpose or non-infringing. The entire risk as to the     *\n*  quality and performance of the Covered Software is with You.        *\n*  Should any Covered Software prove defective in any respect, You     *\n*  (not any Contributor) assume the cost of any necessary servicing,   *\n*  repair, or correction. This disclaimer of warranty constitutes an   *\n*  essential part of this License. No use of any Covered Software is   *\n*  authorized under this License except under this disclaimer.         *\n*                                                                      *\n************************************************************************\n\n************************************************************************\n*                                                                      *\n*  7. Limitation of Liability                                          *\n*  --------------------------                                          *\n*                                                                      *\n*  Under no circumstances and under no legal theory, whether tort      *\n*  (including negligence), contract, or otherwise, shall any           *\n*  Contributor, or anyone who distributes Covered Software as          *\n*  permitted above, be liable to You for any direct, indirect,         *\n*  special, incidental, or consequential damages of any character      *\n*  including, without limitation, damages for lost profits, loss of    *\n*  goodwill, work stoppage, computer failure or malfunction, or any    *\n*  and all other commercial damages or losses, even if such party      *\n*  shall have been informed of the possibility of such damages. This   *\n*  limitation of liability shall not apply to liability for death or   *\n*  personal injury resulting from such party's negligence to the       *\n*  extent applicable law prohibits such limitation. Some               *\n*  jurisdictions do not allow the exclusion or limitation of           *\n*  incidental or consequential damages, so this exclusion and          *\n*  limitation may not apply to You.                                    *\n*                                                                      *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n  This Source Code Form is subject to the terms of the Mozilla Public\n  License, v. 2.0. If a copy of the MPL was not distributed with this\n  file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n  This Source Code Form is \"Incompatible With Secondary Licenses\", as\n  defined by the Mozilla Public License, v. 2.0."
  },
  {
    "path": "open-payment-platform/licenses/LICENSE-thrift.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n--------------------------------------------------\nSOFTWARE DISTRIBUTED WITH THRIFT:\n\nThe Apache Thrift software includes a number of subcomponents with\nseparate copyright notices and license terms. Your use of the source\ncode for the these subcomponents is subject to the terms and\nconditions of the following licenses.\n\n--------------------------------------------------\nPortions of the following files are licensed under the MIT License:\n\n  lib/erl/src/Makefile.am\n\nPlease see doc/otp-base-license.txt for the full terms of this license.\n\n--------------------------------------------------\nFor the aclocal/ax_boost_base.m4 and contrib/fb303/aclocal/ax_boost_base.m4 components:\n\n#   Copyright (c) 2007 Thomas Porschberg <thomas@randspringer.de>\n#\n#   Copying and distribution of this file, with or without\n#   modification, are permitted in any medium without royalty provided\n#   the copyright notice and this notice are preserved.\n\n--------------------------------------------------\nFor the lib/nodejs/lib/thrift/json_parse.js:\n\n/*\n    json_parse.js\n    2015-05-02\n    Public Domain.\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n*/\n(By Douglas Crockford <douglas@crockford.com>)\n\n--------------------------------------------------\nFor lib/cpp/src/thrift/windows/SocketPair.cpp\n\n/* socketpair.c\n * Copyright 2007 by Nathan C. Myers <ncm@cantrip.org>; some rights reserved.\n * This code is Free Software.  It may be copied freely, in original or\n * modified form, subject only to the restrictions that (1) the author is\n * relieved from all responsibilities for any use for any purpose, and (2)\n * this copyright notice must be retained, unchanged, in its entirety.  If\n * for any reason the author might be held responsible for any consequences\n * of copying or use, license is withheld.\n */\n\n\n--------------------------------------------------\nFor lib/py/compat/win32/stdint.h\n\n// ISO C9x  compliant stdint.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124\n//\n//  Copyright (c) 2006-2008 Alexander Chemeris\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//\n//   3. The name of the author may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n\n--------------------------------------------------\nCodegen template in t_html_generator.h\n\n* Bootstrap v2.0.3\n*\n* Copyright 2012 Twitter, Inc\n* Licensed under the Apache License v2.0\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Designed and built with all the love in the world @twitter by @mdo and @fat.\n\n---------------------------------------------------\nFor t_cl_generator.cc\n\n * Copyright (c) 2008- Patrick Collison <patrick@collison.ie>\n * Copyright (c) 2006- Facebook\n\n---------------------------------------------------"
  },
  {
    "path": "open-payment-platform/licenses/LICENSE-wire.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "open-payment-platform/pkg/auth/auth.go",
    "content": "// Copyright 2022 CloudWeGo Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\npackage auth\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/hex\"\n\t\"errors\"\n)\n\ntype SignType string\n\nvar SM3 SignType = \"SM3\"\n\ntype IAuth interface {\n\tGetSignType() SignType\n\tVerify(sign string, data map[string]interface{}) bool\n\tSign(data map[string]interface{}) string\n}\n\nfunc NewSignProvider(signType string, key string) (IAuth, error) {\n\tswitch signType {\n\tcase string(SM3):\n\t\treturn &authSM3{key}, nil\n\tdefault:\n\t\treturn nil, errors.New(\"unsupported sign type\")\n\t}\n}\n\ntype authSM3 struct {\n\tKey string\n}\n\nfunc (a *authSM3) GetSignType() SignType {\n\treturn SM3\n}\n\nfunc (a *authSM3) Verify(sign string, data map[string]interface{}) bool {\n\treturn true\n}\n\nfunc (a *authSM3) Sign(data map[string]interface{}) string {\n\tresult := make([]byte, 10)\n\trand.Read(result) //nolint:errcheck\n\treturn hex.EncodeToString(result)\n}\n"
  }
]